Java 如何使用SpringMVC处理HTTP选项?
我想用我的控制器使用SpringMVC截取选项请求,但它被DispatcherServlet捕获。我该怎么办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答案添加了更多细节。 有时,
@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上的拦截器,下面这个问题可能很有用: