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

时间:2014-06-25 13:51:42

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

我使用Spring Data REST构建RESTful API。到目前为止,我的这个RESTful服务的HTML GUI是从同一个Tomcat提供的,我对Cross Origin请求没有任何问题。

现在我想从不同的服务器提供静态文件。这意味着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参数打开。

2 个答案:

答案 0 :(得分:0)

tl; dr:目前Spring Data REST根本没有回复OPTIONS个请求。

可能值得在JIRA开票。

  

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

这是指定的吗?如果是这样,如果故障单描述包含指向该规范的链接,那将会很酷。

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

    控制器方法上的
  1. @RequestMapping会覆盖method属性,并且现在可以匹配所有 HTTP方法,这就是您查看所有请求被截获的原因。所以你需要在那里定义OPTIONS作为HTTP方法(或者可能不是在类映射中)。
  2. 您首先没有返回任何Allow标题,这是OPTIONS的全部目的。
  3. 我想知道这种方法是否有意义,因为一般来说很难推理支持的HTTP方法。

答案 1 :(得分:0)

只需将参数dispatchOptionsRequest设置为true到调度程序中即可处理Options方法调用,进入WebApplicationInitializer的实现。

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

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

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