使用Spring MVC 4处理跨域预检AJAX OPTIONS请求

时间:2015-05-29 14:48:50

标签: ajax spring-mvc cross-domain preflight http-options-method

这可能是一个简单的答案,但我似乎无法让它发挥作用。在跨域预检AJAX请求中,客户端首先发出OPTIONS请求,然后返回一组标头,以确定远程服务器接受的内容。

现在,对于我创建的每个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请求,而不必为我创建的每个接口创建一个?

1 个答案:

答案 0 :(得分:3)

对于那些感兴趣的人,它就像添加“/ *”的请求映射一样简单。我现在可以从我的控制器中删除所有其他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");