我想用我的控制器使用Spring MVC攔截OPTIONS請求,但它被DispatcherServlet捕獲。我該如何管理?如何使用Spring MVC處理HTTP選項?
回答
@RequestMapping(value="/youroptions", method=RequestMethod.OPTIONS)
public View getOptions() {
}
你應該通過設置配置的DispatcherServlet其dispatchOptionsRequest
到true
實際上它不起作用,因爲DispatcherServlet會攔截請求並且它會處理它。它應該被配置爲DispatcherServlet。我對這個問題感到非常痛苦,目前我部分解決了這個問題。我想爲我的社區發佈我的解決方案,但是...因爲我有不到100的聲望stackoverflow迫使我等待8個小時,讓我回答自己的問題。 – MaVVamaldo 2012-03-01 18:23:40
我添加了更新 – Bozho 2012-03-01 18:29:02
是的,這是解決方案。我以前應該見過你,好神! XD 但是,這是一個「部分」解決方案,因爲在委派您的控制器之前,DispatcherServlet將執行「一些工作」。事實上,即使您不會觸摸「允許」標題,它也會填充「允許的方法」列表。在我的情況下,這不會是一個問題,但我想這是爲別人。 – MaVVamaldo 2012-03-01 18:34:51
我增加了一些更詳細的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將允許的方法列表附加到響應中。在我的情況下,這並不重要,我放過這個東西。也許還需要進一步的考試。
但是這不起作用,例如,如果在端點「/ x/y」處註冊了一個handlermethod。現在,對/ x的選項請求有效,但不對/ x/y 有沒有解決此問題的選項?意思是將這個OPTIONS處理添加到所有註冊的端點?我想到攔截器,但還有其他方法嗎? – wrm 2012-06-18 13:23:07
作爲對上述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");
}
我採取了以下做法:
使用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>
我見過用/ **方法的問題是更具體的控制器實現將其覆蓋。
春天沒有web.xml文件,並根據保羅·亞當森的回答,我只是設置的參數dispatchOptionsRequest
到true
在調度程序,來處理Options
方法調用。
ServletRegistration.Dynamic dispatcher = container.addServlet("dispatcher", new DispatcherServlet(applicationContext));
dispatcher.setInitParameter("dispatchOptionsRequest", "true");
dispatcher.setLoadOnStartup(1);
dispatcher.addMapping("/*");
- 1. Spring MVC - 通用HTTP處理程序
- 2. 使用Spring MVC處理MaxUploadSizeExceededException
- 3. HTTP選項使用LIFT處理動詞
- 4. Spring MVC如何處理多個用戶
- 5. Spring MVC控制器如何處理多個長的http請求?
- 6. 使用HandlerExceptionResolver處理Spring MVC異常
- 7. 使用Spring MVC處理請求
- 8. 使用Spring MVC的錯誤處理
- 9. 處理Spring MVC中的可選ListBox值
- 10. Spring MVC如何處理響應
- 11. Spring MVC表單處理如何工作?
- 12. 如何使用Spring MVC處理用戶登錄?
- 13. 如何使用Spring Security 3.0.x處理HTTP 403
- 14. 在Angular JS中使用Spring MVC處理會話處理
- 15. 如何處理在Spring MVC中使用@ResponseBody時的錯誤
- 16. 如何處理使用MVC onchange [「文本」]的HTTP POST
- 17. 如何使用Spring MVC編寫項目?
- 18. Java Spring遠程處理選項
- 19. Spring MVC中處理錯誤
- 20. Spring MVC處理表格
- 21. 在Spring MVC中處理cookie
- 22. spring java mvc錯誤處理
- 23. 如何用spring處理CompletionStage?
- 24. Spring Remoting HTTP調用者 - 異常處理
- 25. 如何使用Spring MVC將Java Map放入Optgroup選項?
- 26. Spring批處理如何使用ItemReadListener
- 27. 如何使用我的HTTP處理程序選擇路徑和其餘的MVC處理程序?
- 28. Spring Data REST CORS - 如何處理預檢選項請求?
- 29. Spring中的@RequestParam如何處理Guava的可選項?
- 30. 在Spring MVC展示中如何處理使用JSON的HTTP請求?在這個期間理解
對於那些在春季啓動,這個後續的問題可能是有用的:http://stackoverflow.com/questions/33331042/how-to-handle-http-options-requests-in-spring-boot – Jonik 2015-10-25 22:19:50