我正在尝试使用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实现(基于自定义特征),并且所有这些行为都是相同的。
我在这里缺少什么?
答案 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响应的一部分。