如何使用Spring MVC处理HTTP OPTIONS?
我想使用我的控制器使用Spring MVC拦截OPTIONS请求,但它被DispatcherServlet捕获。 我该如何管理?
@RequestMapping(value="/youroptions", method=RequestMethod.OPTIONS) public View getOptions() { }
您应该通过将dispatchOptionsRequest
设置为true
来配置dispatcherServlet
我为初学者添加了一些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,如下所示:
... yourServlet org.springframework.web.servlet.DispatcherServlet dispatchOptionsRequest true 1 ...
添加“dispatchOptionsRequest”参数并将其设置为true。
现在,DispatcherServlet将OPTIONS处理委托给您的控制器,manageOption()方法将执行。
希望这可以帮助。
PS。 说实话,我看到DispatcherServlet将允许的方法列表附加到响应中。 在我的情况下,这并不重要,我放弃了。 也许需要进一步的检查。
作为上述2个答案的快速补充,这里是如何在servlet 3(无web.xml)环境中启用dispatchOptionsRequest,因为我花了一些时间来研究如何在非xml设置中应用上述答案。
在Spring 3.2 / servlet 3环境中,您将拥有一些DispatcherServlet
初始化类,它是java等效的web.xml; 在我的例子中,它是AbstractAnnotationConfigDispatcherServletInitializer
。 添加以下代码将启用dispatchOptionsRequest:
@Override protected void customizeRegistration(Dynamic registration) { registration.setInitParameter("dispatchOptionsRequest", "true"); }
我采取了以下方法:
使用Maven( 或手动 )提取此依赖性:
com.thetransactioncompany cors-filter 1.3.2
这有一个实现来捕获所有入站OPTIONS请求。 进入web.xml文件添加以下配置:
CORS com.thetransactioncompany.cors.CORSFilter cors.supportedHeaders Content-Type,Accept,Origin CORS /*
我用/ **方法看到的问题是一个更具体的控制器实现将覆盖它。
对于没有web.xml文件的Spring,并且基于Paul Adamson的回答,我只是将参数dispatchOptionsRequest
设置为true
到调度程序中,以处理Options
方法调用。
ServletRegistration.Dynamic dispatcher = container.addServlet("dispatcher", new DispatcherServlet(applicationContext)); dispatcher.setInitParameter("dispatchOptionsRequest", "true"); dispatcher.setLoadOnStartup(1); dispatcher.addMapping("/*");