【问题标题】:Handling cross domain preflight AJAX OPTIONS requests with Spring MVC 4使用 Spring MVC 4 处理跨域预检 AJAX OPTIONS 请求
【发布时间】:2015-08-12 11:59:40
【问题描述】:

这可能是一个简单的答案,但我似乎无法让它发挥作用。在跨域、预检 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 请求,而不必为我创建的每个接口都创建一个?

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 这是克服预检选项请求的技巧吗?无论如何,它有效。
    • 不,这不是 hack。预检 OPTIONS 请求将始终按定义发生,您可以确保响应有效并包含正确的 CORS 标头。此解决方案 a) 允许您仅定义一个控制器方法来定义所有预检请求的 OPTIONS 响应,并且 b) 防止 Spring Security 阻止 OPTIONS 请求。也许有一些较低级别的方法可以做到这一点,但这是我在 Spring 中能找到的最简单的方法。
    猜你喜欢
    • 2015-04-28
    • 2011-03-30
    • 2018-01-03
    • 2019-08-29
    • 2021-03-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-19
    • 2015-08-08
    相关资源
    最近更新 更多