如何使用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("/*");