Spring Data REST CORS - 如何处理预检选项请求?

Posted

技术标签:

【中文标题】Spring Data REST CORS - 如何处理预检选项请求?【英文标题】:Spring Data REST CORS - how to handle preflight OPTIONS request? 【发布时间】:2014-08-16 03:07:38 【问题描述】:

我正在使用 Spring Data REST 构建一个 RESTful API。到目前为止,我的这个 RESTful 服务的 html GUI 是由同一个 Tomcat 提供的,而且我在跨域请求方面没有任何问题。

现在我想从不同的服务器提供静态文件。这意味着 API 在另一个域/端口上。浏览器将发送 OPTIONS 请求以从服务器获取 Access-Control 标头。不幸的是,Spring Data REST 不处理那些 OPTIONS 请求,甚至返回 HTTP 500。

我尝试创建一个处理所有 OPTIONS 请求的自定义控制器

@Controller
@RequestMapping(value = "/**", method = RequestMethod.OPTIONS)
public class OptionsController 

    @RequestMapping
    public ResponseEntity options() 
        return new ResponseEntity<Void>(HttpStatus.OK);
    

这对 OPTIONS 有效,但随后所有其他请求(如 GET)停止工作。

OPTIONS 请求通过 dispatchOptionsRequest 调度器 servlet 参数打开。

【问题讨论】:

你试过Tomcat的CORS过滤器吗? 没有。该问题在下一版本的 SDR 中得到修复。我们只是使用反向代理将请求映射到相同的域和端口。 【参考方案1】:

tl;dr:目前 Spring Data REST 根本不响应 OPTIONS 请求。

也许值得在我们的JIRA 开一张票。

浏览器将发送 OPTIONS 请求以从服务器获取访问控制标头。

这是在某处指定的吗?如果是这样,如果票证描述包含指向该规范的链接,那就太酷了。

一些关于您的解决方法的方法:

    控制器方法上的@RequestMapping 覆盖了method 属性,并且预计现在匹配所有 HTTP 方法,这就是您看到所有请求被拦截的原因。因此,您也需要在此处将 OPTIONS 定义为 HTTP 方法(或者可能不是在类映射中)。 您没有返回任何 Allow 标头,这首先是 OPTIONS 的全部目的。 我想知道这种方法总体上是否有意义,因为通常很难推断支持的 HTTP 方法。

【讨论】:

感谢您的回答!我试过 1),应该已经发布了。不工作。一旦我注册了我的控制器,就没有 Data REST 导出的方法起作用。标题被添加到过滤器中。第 3 点,我认为 CORS 是一个常见问题,应该得到支持,尤其是对于 REST API。 我打开了jira.spring.io/browse/DATAREST-333。包括对 w3c 和 Mozilla 的引用。 @OliverGierke 我注意到 Spring Data REST 使用设置为“允许”的 org.springframework.http.HttpHeaders.ALLOW 设置允许方法标头。根据这个W3C Recommendation,标题名称应该是Access-Control-Allow-Methods。为什么会出现这种差异? 我们目前只是实现了规范中定义的 HTTP OPTIONS 方法。【参考方案2】:

只需将参数dispatchOptionsRequest设置为true进入dispatcher处理Options方法调用,进入WebApplicationInitializer的实现。

ServletRegistration.Dynamic dispatcher = container.addServlet("dispatcher", new DispatcherServlet(applicationContext));

dispatcher.setInitParameter("dispatchOptionsRequest", "true");                

dispatcher.setLoadOnStartup(1);
dispatcher.addMapping("/*");

【讨论】:

以上是关于Spring Data REST CORS - 如何处理预检选项请求?的主要内容,如果未能解决你的问题,请参考以下文章

Spring Data Rest 和 Cors

Spring Boot + Spring Data Rest Repositories 中使用 @CrossOrigin 注释的 CORS 问题

无法在 Spring Boot Data Rest 中启用 CORS

Spring boot:无法从另一个 Origin 访问安全资源 - CORS - Spring Security - Spring data rest

Spring Boot Data Rest + CORS 未正确启用 OPTIONS/DELETE

在带有 CORS 的 REST 中使用 Spring 登录时出现问题