3

我正在使用 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 参数打开。

4

2 回答 2

0

只需将参数设置dispatchOptionsRequesttrue调度程序中以处理Options方法调用,进入WebApplicationInitializer.

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

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

dispatcher.setLoadOnStartup(1);
dispatcher.addMapping("/*");
于 2015-01-03T21:19:23.770 回答
0

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

在我们的JIRA中打开一张票可能是值得的。

浏览器将发送 OPTIONS 请求以从服务器获取 Access-Control 标头。

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

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

  1. @RequestMapping控制器上的方法会覆盖该method属性,并且预期现在匹配所有HTTP 方法,这就是您看到所有请求被拦截的原因。所以你也需要在OPTIONS那里定义为 HTTP 方法(或者可能不是在类映射中)。
  2. 您没有返回任何Allow标题,这首先是整个目的OPTIONS
  3. 我想知道这种方法总体上是否有意义,因为通常很难推断支持的 HTTP 方法。
于 2014-06-25T14:06:12.870 回答