2014-06-25 33 views
2

我正在使用Spring Data REST構建一個RESTful API。到目前爲止,我的這個RESTful服務的HTML GUI來自同一個Tomcat,並且我沒有發現Cross Origin請求的問題。Spring Data REST CORS - 如何處理預檢選項請求?

現在我想提供來自不同服務器的靜態文件。這意味着API在另一個域/端口上。瀏覽器將發送OPTIONS請求以從服務器獲取訪問控制標題。不幸的是春天的數據REST不處理這些選項的請求,甚至返回一個HTTP 500

我試圖創建一個處理所有選項的定製控制器請求

@Controller 
@RequestMapping(value = "/**", method = RequestMethod.OPTIONS) 
public class OptionsController { 

    @RequestMapping 
    public ResponseEntity options() { 
     return new ResponseEntity<Void>(HttpStatus.OK); 
    } 
} 

這對於OPTIONS工作,但後來所有其他請求(像GET)停止工作。

通過dispatchOptionsRequest調度程序servlet參數打開OPTIONS請求。

+0

您是否嘗試過Tomcat的CORS過濾器? –

+0

不是。該問題在下一個版本的SDR中得到解決。 我們只是使用反向代理將請求映射到相同的域和端口。 – FrontierPsychiatrist

回答

0

tl; dr:目前Spring Data REST根本不回答OPTIONS請求。

這可能是值得在我們的JIRA開票。

瀏覽器將發送OPTIONS請求以從服務器獲取訪問控制標題。

這是指定的地方嗎?如果是這樣,如果票據描述包含指向該規範的鏈接,那將會很酷。

關於你的方法的解決方法,需要注意幾點:

  1. @RequestMapping控制器上的方法重寫method屬性,果然現在匹配所有 HTTP方法,這就是爲什麼你看到截獲所有請求。因此,您還需要在其中定義OPTIONS作爲HTTP方法(或者也可以不在類映射中)。
  2. 您沒有返回任何Allow標題,這首先是OPTIONS的全部用途。
  3. 我想知道一般情況下這種方法是否合理,因爲一般情況下很難推斷所支持的HTTP方法。
+0

感謝您的回答! 我試過1),應該已經發布了。不工作。只要我註冊我的控制器沒有數據REST導出方法確實工作。 標題被添加到過濾器中。 第3點,以及我認爲CORS是一個常見問題,應該支持,特別是對於REST API。 – FrontierPsychiatrist

+1

我打開了https://jira.spring.io/browse/DATAREST-333。包括對w3c和mozilla的引用。 – FrontierPsychiatrist

+0

完美,謝謝! :) –

0

參數dispatchOptionsRequest正好被設置爲true在調度程序來處理Options方法調用,爲WebApplicationInitializer的實施。

ServletRegistration.Dynamic dispatcher = container.addServlet("dispatcher", new DispatcherServlet(applicationContext)); 

dispatcher.setInitParameter("dispatchOptionsRequest", "true");     

dispatcher.setLoadOnStartup(1); 
dispatcher.addMapping("/*");