如何使用Spring MVC处理HTTP OPTIONS?

MaV*_*ldo 27 java http spring-mvc http-options-method

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

MaV*_*ldo 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
    }
}
Run Code Online (Sandbox Code Playgroud)

它将无法工作,因为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>
...
Run Code Online (Sandbox Code Playgroud)

添加"dispatchOptionsRequest"参数并将其设置为true.

现在,DispatcherServlet将OPTIONS处理委托给您的控制器,manageOption()方法将执行.

希望这可以帮助.

PS.说实话,我看到DispatcherServlet将允许的方法列表附加到响应中.在我的情况下,这并不重要,我放弃了.也许需要进一步的考试.


Boz*_*zho 12

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

}
Run Code Online (Sandbox Code Playgroud)

您应该通过将其设置为dispatchOptionsRequest来配置dispatcherServlettrue


Pau*_*son 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");
    }
Run Code Online (Sandbox Code Playgroud)