如何使用Spring MVC处理HTTP OPTIONS?

时间:2012-03-01 18:20:02

标签: java http spring-mvc http-options-method

我想使用我的控制器使用Spring MVC拦截OPTIONS请求,但它被DispatcherServlet捕获。我该如何管理?

5 个答案:

答案 0 :(得分:33)

我为初学者添加了更多关于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 :(得分:12)

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

}

您应该通过将其dispatchOptionsRequest设置为true

来配置dispatcherServlet

答案 2 :(得分: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 :(得分:3)

我采取了以下方法:

使用Maven(or manually)获取此依赖性:

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

这有一个捕获所有入站OPTIONS请求的实现。在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>

我用/ **方法看到的问题是一个更具体的控制器实现将覆盖它。

答案 4 :(得分:0)

对于没有web.xml文件的Spring,基于Paul Adamson的回答,我只是将参数dispatchOptionsRequest设置为true到调度程序中,以处理Options方法调用。 / p>

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

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

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