akka http中的cors与headerValueByName问题(akka-http-cors)

时间:2016-11-21 15:29:00

标签: scala cors akka akka-http

我正在尝试使用akka-http-cors为我的akka​​ http API添加CORS支持:https://github.com/lomigmegard/akka-http-cors

当我基本上为简单路线添加cors支持时,一切都运行正常,例如:

val route = cors() {
    path("ping") {
       get {
           complete("pong")
       }
    }
}

使用相应的jQuery调用:

$.ajax({
     url: "http://localhost:9000/ping",
     type: "GET",
     success: function(data) { alert(data); }
  });

按预期正确“pong”

但是当我尝试从请求中提取(服务器端)一些特定的头时,对响应的cors支持似乎突然被打破了。例如,用:

val route = cors() {
    headerValueByName("myheader") { (myheader) =>
       path("ping") {
           get {
               complete("pong")
           }
       }
    }
}

使用相应的jQuery调用:

$.ajax({
     url: "http://localhost:9000/ping",
     type: "GET",
     beforeSend: function(xhr){xhr.setRequestHeader('myheader', 'test');},
     success: function(data) { alert('Success!' + data); }
  });

在控制台中出现cors错误失败:

XMLHttpRequest cannot load http://localhost:9000/ping. 
No 'Access-Control-Allow-Origin' header is present on the requested resource.
Origin 'http://localhost:8080' is therefore not allowed access. 
The response had HTTP status code 400.

似乎将 headerValueByName(...)添加到路线中会破坏战队的支持,我无法弄清楚原因。

我也尝试了不同的cors实现(基于自定义特征),并且所有这些行为都是相同的。

我在这里缺少什么?

1 个答案:

答案 0 :(得分:2)

请使用curl等工具调试服务器路由,以查看服务器的实际响应,而不是JavaScript的解释。

curl -X GET -H "Origin: http://example.com" -H "myheader: test" http://localhost:9000/ping

我怀疑您的自定义标头未在HTTP请求中正确发送。然后headerValueByName指令将拒绝该请求。拒绝冒泡(跳过cors指令)最终由默认拒绝处理程序处理。因此,无法响应与CORS相关的标头。

你应该让你的拒绝和异常处理程序在<{1}}指令内,而不是在外面(比如默认的)。请看下面的例子。

cors

这不会解决您的标头问题,但即使路由被拒绝或因异常而失败,至少CORS标头也将成为HTTP响应的一部分。