【问题标题】:Spring Data REST CORS - how to handle preflight OPTIONS request?Spring Data REST CORS - 如何处理预检选项请求?
【发布时间】: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 中得到修复。我们只是使用反向代理将请求映射到相同的域和端口。

标签: spring cors spring-data-rest http-options-method


【解决方案1】:

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

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 2016-02-17
    • 2018-07-24
    • 2014-10-31
    • 1970-01-01
    • 2013-11-25
    • 2018-11-12
    • 2014-05-23
    • 2014-03-14
    • 2021-05-11
    相关资源
    最近更新 更多