2012-03-01 22 views
23

我想用我的控制器使用Spring MVC攔截OPTIONS請求,但它被DispatcherServlet捕獲。我該如何管理?如何使用Spring MVC處理HTTP選項?

+2

對於那些在春季啓動,這個後續的問題可能是有用的:http://stackoverflow.com/questions/33331042/how-to-handle-http-options-requests-in-spring-boot – Jonik 2015-10-25 22:19:50

回答

9
@RequestMapping(value="/youroptions", method=RequestMethod.OPTIONS) 
public View getOptions() { 

} 

你應該通過設置配置的DispatcherServlet其dispatchOptionsRequesttrue

+0

實際上它不起作用,因爲DispatcherServlet會攔截請求並且它會處理它。它應該被配置爲DispatcherServlet。我對這個問題感到非常痛苦,目前我部分解決了這個問題。我想爲我的社區發佈我的解決方案,但是...因爲我有不到100的聲望stackoverflow迫使我等待8個小時,讓我回答自己的問題。 – MaVVamaldo 2012-03-01 18:23:40

+0

我添加了更新 – Bozho 2012-03-01 18:29:02

+1

是的,這是解決方案。我以前應該見過你,好神! XD 但是,這是一個「部分」解決方案,因爲在委派您的控制器之前,DispatcherServlet將執行「一些工作」。事實上,即使您不會觸摸「允許」標題,它也會填充「允許的方法」列表。在我的情況下,這不會是一個問題,但我想這是爲別人。 – MaVVamaldo 2012-03-01 18:34:51

30

我增加了一些更詳細的Bozho答案初學者。 有時讓Spring Controller管理OPTIONS請求(例如,設置正確的「Access-Control-Allow- *」頭以服務於AJAX調用)會很有用。 但是,如果你嘗試常見的做法

@Controller 
public class MyController { 

    @RequestMapping(method = RequestMethod.OPTIONS, value="/**") 
    public void manageOptions(HttpServletResponse response) 
    { 
     //do things 
    } 
} 

它不會起作用,因爲DispatcherServlet會攔截客戶端的OPTIONS請求。

的解決方法非常簡單:

你必須......從web.xml文件中配置的DispatcherServlet如下:

... 
    <servlet> 
    <servlet-name>yourServlet</servlet-name> 
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
    <init-param> 
     <param-name>dispatchOptionsRequest</param-name> 
     <param-value>true</param-value> 
    </init-param> 
    <load-on-startup>1</load-on-startup> 
    </servlet> 
... 

添加「dispatchOptionsRequest」參數設置爲true 。

現在DispatcherServlet會將OPTIONS處理委派給您的控制器,並且將執行manageOption()方法。

希望這會有所幫助。

PS。說實話,我發現DispatcherServlet將允許的方法列表附加到響應中。在我的情況下,這並不重要,我放過這個東西。也許還需要進一步的考試。

+1

但是這不起作用,例如,如果在端點「/ x/y」處註冊了一個handlermethod。現在,對/ x的選項請求有效,但不對/ x/y 有沒有解決此問題的選項?意思是將這個OPTIONS處理添加到所有註冊的端點?我想到攔截器,但還有其他方法嗎? – wrm 2012-06-18 13:23:07

8

作爲對上述2個答案的快速補充,以下是如何在servlet 3(無web.xml)環境中啓用dispatchOptionsRequest,因爲它花了我一段時間才弄清楚如何在非xml中應用上述答案建立。

在spring 3.2/servlet 3環境中,您將擁有一些DispatcherServlet初始化類,它是web.xml的java等價物;在我的情況下,它是AbstractAnnotationConfigDispatcherServletInitializer。加入以下代碼將使dispatchOptionsRequest:

@Override 
    protected void customizeRegistration(Dynamic registration) { 
     registration.setInitParameter("dispatchOptionsRequest", "true"); 
    } 
3

我採取了以下做法:

使用Maven(or manually)拉在此扶養:

<dependency> 
    <groupId>com.thetransactioncompany</groupId> 
    <artifactId>cors-filter</artifactId> 
    <version>1.3.2</version> 
</dependency> 

這有可能捕獲所有的實現入站選項請求。到web.xml文件中添加以下配置:

<filter> 
    <filter-name>CORS</filter-name> 
    <filter-class>com.thetransactioncompany.cors.CORSFilter</filter-class>  
    <init-param> 
     <param-name>cors.supportedHeaders</param-name> 
     <param-value>Content-Type,Accept,Origin</param-value> 
    </init-param> 
</filter> 

<filter-mapping> 
    <filter-name>CORS</filter-name> 
    <url-pattern>/*</url-pattern> 
</filter-mapping> 

我見過用/ **方法的問題是更具體的控制器實現將其覆蓋。

0

春天沒有web.xml文件,並根據保羅·亞當森的回答,我只是設置的參數dispatchOptionsRequesttrue在調度程序,來處理Options方法調用。

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

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

dispatcher.setLoadOnStartup(1); 
dispatcher.addMapping("/*"); 
相關問題