使用 Spring MVC 4 处理跨域预检 AJAX OPTIONS 请求
Handling cross domain preflight AJAX OPTIONS requests with Spring MVC 4
这可能是一个简单的答案,但我似乎无法让它发挥作用。在 cross-domain、preflight AJAX 请求中,客户端首先发出一个 OPTIONS 请求,只获取一组 headers 返回以确定远程服务器接受什么。
现在,对于我创建的每个 Spring 控制器 POST 界面,我还必须创建一个 OPTIONS 界面,如下所示:
@RequestMapping(method = RequestMethod.OPTIONS, value = "/addWebService")
public ResponseEntity addWebServiceOptions() {
return new ResponseEntity(HttpStatus.NO_CONTENT);
}
@RequestMapping(method = RequestMethod.POST, value = "/addWebService")
public AjaxResponse<WebService> addWebService(Principal principal, @RequestBody WebService webService) throws UserServiceException { ... }
我在某处读到,您可以只创建一个没有映射到特定路径的简单方法来处理所有 OPTIONS 请求,如下所示:
@RequestMapping(method = RequestMethod.OPTIONS)
public ResponseEntity handle() {
return new ResponseEntity(HttpStatus.NO_CONTENT);
}
但是,当我添加该方法时,我提交的每个请求都指出它无法找到到我所请求资源的映射。
有没有一种方法可以在一个方法中处理所有 OPTIONS 请求,而不必为我创建的每个接口都创建一个方法?
有兴趣的可以加一个“/*”的请求映射。我现在可以从我的控制器中删除所有其他 OPTIONS 方法,并使用这个单一方法处理所有预检 OPTIONS 请求:
@RequestMapping(method = RequestMethod.OPTIONS, value = "/*")
@ResponseBody
public ResponseEntity handleOptions() {
return new ResponseEntity(HttpStatus.NO_CONTENT);
}
同样值得注意的是,我必须将其添加到我的安全配置中以允许所有请求进行 OPTIONS 调用而不会收到 403 错误(并允许 websockets 正确连接):
http
.authorizeRequests()
.antMatchers(HttpMethod.OPTIONS, "/**").permitAll()
.antMatchers("/stomp/**").permitAll()
.antMatchers("/**").hasRole("USER");
这可能是一个简单的答案,但我似乎无法让它发挥作用。在 cross-domain、preflight AJAX 请求中,客户端首先发出一个 OPTIONS 请求,只获取一组 headers 返回以确定远程服务器接受什么。
现在,对于我创建的每个 Spring 控制器 POST 界面,我还必须创建一个 OPTIONS 界面,如下所示:
@RequestMapping(method = RequestMethod.OPTIONS, value = "/addWebService")
public ResponseEntity addWebServiceOptions() {
return new ResponseEntity(HttpStatus.NO_CONTENT);
}
@RequestMapping(method = RequestMethod.POST, value = "/addWebService")
public AjaxResponse<WebService> addWebService(Principal principal, @RequestBody WebService webService) throws UserServiceException { ... }
我在某处读到,您可以只创建一个没有映射到特定路径的简单方法来处理所有 OPTIONS 请求,如下所示:
@RequestMapping(method = RequestMethod.OPTIONS)
public ResponseEntity handle() {
return new ResponseEntity(HttpStatus.NO_CONTENT);
}
但是,当我添加该方法时,我提交的每个请求都指出它无法找到到我所请求资源的映射。
有没有一种方法可以在一个方法中处理所有 OPTIONS 请求,而不必为我创建的每个接口都创建一个方法?
有兴趣的可以加一个“/*”的请求映射。我现在可以从我的控制器中删除所有其他 OPTIONS 方法,并使用这个单一方法处理所有预检 OPTIONS 请求:
@RequestMapping(method = RequestMethod.OPTIONS, value = "/*")
@ResponseBody
public ResponseEntity handleOptions() {
return new ResponseEntity(HttpStatus.NO_CONTENT);
}
同样值得注意的是,我必须将其添加到我的安全配置中以允许所有请求进行 OPTIONS 调用而不会收到 403 错误(并允许 websockets 正确连接):
http
.authorizeRequests()
.antMatchers(HttpMethod.OPTIONS, "/**").permitAll()
.antMatchers("/stomp/**").permitAll()
.antMatchers("/**").hasRole("USER");