Spring Boot和PreFlight请求

时间:2017-11-01 12:15:44

标签: javascript java spring spring-boot cors

我正在使用Spring Boot version 2.0.0.M5

我的JavaScript应用程序在调用暴露的Rest端点时遇到问题。 为了安全起见 - 我希望传入包含api密钥的标头。 但是 - 预检请求(选项)没有标题集

以下JavaScript代码段为我重现错误

var baseEndpoint = "http://localhost:8480";
var data = null; 
var xhr = new XMLHttpRequest(); 
xhr.withCredentials = true;
xhr.addEventListener("readystatechange", function () {
  if (this.readyState === 4) {
    console.log(this.responseText);
  }
});
xhr.open("GET", baseEndpoint + "/api/issue/user/1");
xhr.setRequestHeader("x-api-key", "fdarwetr5467hyyerf");
xhr.setRequestHeader("cache-control", "no-cache");
xhr.setRequestHeader("Accept","application/json");
xhr.setRequestHeader("Content-Type","application/json");
xhr.setRequestHeader("Origin", "localhost");
xhr.send(null);

即使我将其作为OPTIONS请求 - 也未传递x-api-ke y标头

我在Spring Boot中设置的cors如下

@Override
public void addCorsMappings(CorsRegistry corsRegistry) {
    super.addCorsMappings(corsRegistry);
    corsRegistry.addMapping("/**").allowedMethods("*").allowedOrigins("*").exposedHeaders("x-api-key", "apiKey").allowedHeaders("x-api-key", "apiKey").allowCredentials(true);      
}

我想知道处理这些预检请求的正确方法是什么?或者有没有人有任何建议让标题传递?

1 个答案:

答案 0 :(得分:1)

我通过在所有api请求上添加过滤器来解决这个问题 当请求方法是OPTIONS时 - 我只是成功退出过滤器

    if ("OPTIONS".equals(request.getMethod())) {
        response.setStatus(HttpServletResponse.SC_OK);
        return super.preHandle(request, response, handler);
    }