我想用我的控制器使用 Spring MVC 拦截 OPTIONS 请求,但它被 DispatcherServlet 捕获。我该如何管理?
5 回答
我为初学者的 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 将允许的方法列表附加到响应中。就我而言,这并不重要,我放手了。也许需要进一步的检查。
@RequestMapping(value="/youroptions", method=RequestMethod.OPTIONS)
public View getOptions() {
}
您应该通过将 dispatcherServlet 设置dispatchOptionsRequest
为true
作为对上述 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");
}
我采取了以下方法:
使用 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("/*");