我想使用我的控制器使用Spring MVC拦截OPTIONS请求,但它被DispatcherServlet捕获。我该如何管理?
答案 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
答案 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("/*");