Java 如何使用SpringMVC处理HTTP选项?

Java 如何使用SpringMVC处理HTTP选项?,java,http,spring-mvc,http-options-method,Java,Http,Spring Mvc,Http Options Method,我想用我的控制器使用SpringMVC截取选项请求,但它被DispatcherServlet捕获。我该怎么办 @RequestMapping(value="/youroptions", method=RequestMethod.OPTIONS) public View getOptions() { } 您应该通过将dispatcherServlet的DispatchesOptions请求设置为true来配置dispatcherServlet。我为初学者的Bozho答案添加了更多细节。 有时,

我想用我的控制器使用SpringMVC截取选项请求,但它被DispatcherServlet捕获。我该怎么办

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

}

您应该通过将dispatcherServlet的
DispatchesOptions请求设置为
true
来配置dispatcherServlet。我为初学者的Bozho答案添加了更多细节。 有时,让Spring控制器管理选项请求是很有用的(例如,设置正确的“Access Control Allow-*”头来服务AJAX调用)。 但是,如果您尝试常规做法

@Controller
public class MyController {

    @RequestMapping(method = RequestMethod.OPTIONS, value="/**")
    public void manageOptions(HttpServletResponse response)
    {
        //do things
    }
}
因为DispatcherServlet将拦截客户端的选项请求,所以它将不起作用

解决方法非常简单:

你必须。。。从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>
...
。。。
yourServlet
org.springframework.web.servlet.DispatcherServlet
DispatchOptions请求
真的
1.
...
添加“DispatchOptions请求”参数并将其设置为true

现在DispatcherServlet将把选项处理委托给控制器,并执行manageOption()方法

希望这有帮助


老实说,我看到DispatcherServlet将允许的方法列表附加到响应中。在我的情况下,这并不重要,我就放手了。可能还需要进一步的检查。

作为对上述两个答案的快速补充,以下是如何在servlet 3(无web.xml)环境中启用DispatchOptions请求,因为我花了一些时间才弄清楚如何在非xml设置中应用上述答案

在spring 3.2/servlet 3环境中,您将拥有一些不同的
DispatcherServlet
initializer类,它是web.xml的java等价物;在我的例子中,它是
抽象注释配置Dispatchers ServletInitializer
。添加以下代码将启用DispatchOptions请求:

    @Override
    protected void customizeRegistration(Dynamic registration) {
        registration.setInitParameter("dispatchOptionsRequest", "true");
    }

我采取了以下办法:

使用Maven()拉入此依赖关系:

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

交易公司
cors过滤器
1.3.2
这有一个捕获所有入站选项请求的实现。在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>

科尔斯
com.thetransactioncompany.cors.CORSFilter
cors.supportedHeaders
内容类型、接受、来源
科尔斯
/*

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

对于没有web.xml文件的Spring,基于Paul Adamson的回答,我只是将参数
DispatchOptions Request
设置为
true
,以处理
选项
方法调用

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

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

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

实际上它不会工作,因为DispatcherServlet将拦截请求并处理它。应将其配置为DispatcherServlet。我对这个问题感到非常痛苦,目前我已经部分解决了这个问题。我想为社区发布我的解决方案,但是。。。因为我只有不到100个问题,所以我必须等8个小时才能让我回答我自己的问题。是的,这就是解决办法。我早该见到你的,上帝啊!XD然而,这是一个“局部”解决方案,因为DispatcherServlet将在委派控制器之前做一些“工作”。事实上,即使你不去碰“Allow”标题,它也会被一个“allowed method”列表填满。在我的情况下,这不会是一个问题,但我认为是针对其他人的。重要更新:从Spring Framework 4.3开始,默认情况下将支持选项请求,有关更多详细信息,请参阅。但是,如果在端点“/x/y”处注册了handlermethod,则这不起作用。现在,对/x的选项请求有效,但对/x/y的选项请求无效。是否有任何选项可以解决此问题?是否要将此选项处理添加到所有已注册端点?我考虑过拦截器,但还有其他方法吗?对于那些在Spring Boot上的拦截器,下面这个问题可能很有用: