我想使用Spring MVC控制器拦截OPTIONS请求,但它被DispatcherServlet捕获了。我该怎么处理?
我在Bozho的答案中为初学者添加了更多细节。 有时,让Spring控制器管理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将允许的方法列表附加到响应中。在我的情况下,这不重要,所以我放任不管。也许需要进一步的调查。
@RequestMapping(value="/youroptions", method=RequestMethod.OPTIONS)
public View getOptions() {
}
您应该通过将其dispatchOptionsRequest
设置为true
来配置dispatcherServlet。
@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>
这是一个用于捕获所有入站 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>
对于没有web.xml文件的Spring项目,根据Paul Adamson的答案,我只需将参数dispatchOptionsRequest
设置为true
,以便在调度程序中处理Options
方法调用。
ServletRegistration.Dynamic dispatcher = container.addServlet("dispatcher", new DispatcherServlet(applicationContext));
dispatcher.setInitParameter("dispatchOptionsRequest", "true");
dispatcher.setLoadOnStartup(1);
dispatcher.addMapping("/*");