28

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

4

5 回答 5

34

我为初学者的 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 将允许的方法列表附加到响应中。就我而言,这并不重要,我放手了。也许需要进一步的检查。

于 2012-03-02T08:45:27.300 回答
12
@RequestMapping(value="/youroptions", method=RequestMethod.OPTIONS)
public View getOptions() {

}

您应该通过将 dispatcherServlet 设置dispatchOptionsRequesttrue

于 2012-03-01T18:21:51.683 回答
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");
    }
于 2013-04-02T10:23:17.713 回答
4

我采取了以下方法:

使用 Maven(或手动)引入这种依赖关系:

<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>

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

于 2013-04-15T18:17:00.667 回答
0

对于没有 web.xml 文件的 Spring,并且基于 Paul Adamson 的回答,我只是将参数设置dispatchOptionsRequesttrue调度程序,以处理Options方法调用。

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

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

dispatcher.setLoadOnStartup(1);
dispatcher.addMapping("/*");
于 2015-01-03T21:15:50.783 回答