tnu*_*mak 19 javascript node.js cors express jqxhr
触发AJAX GET
以http://qualifiedlocalhost:8888/resource.json
启动预期的CORS预飞行,看起来它正确回归:
OPTIONS
请求Request URL:http://qualifiedlocalhost:8888/resource.json
Request Method:OPTIONS
Status Code:200 OK
Run Code Online (Sandbox Code Playgroud)
请求标题
Accept:*/*
Accept-Encoding:gzip,deflate,sdch
Accept-Language:en-US,en;q=0.8
Access-Control-Request-Headers:accept, origin, x-requested-with
Access-Control-Request-Method:GET
Cache-Control:no-cache
Connection:keep-alive
Host:qualifiedlocalhost:8888
Origin:http://localhost:9000
Pragma:no-cache
Referer:http://localhost:9000/
User-Agent:Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.71 Safari/537.36
Run Code Online (Sandbox Code Playgroud)
响应标题
Access-Control-Allow-Headers:Content-Type, X-Requested-With
Access-Control-Allow-Methods:GET,PUT,POST,DELETE
Access-Control-Allow-Origin:*
Connection:keep-alive
Content-Length:2
Content-Type:text/plain
Date:Thu, 01 Aug 2013 19:57:43 GMT
Set-Cookie:connect.sid=s%3AEpPytDm3Dk3H9V4J9y6_y-Nq.Rs572s475TpGhCP%2FK%2B2maKV6zYD%2FUg425zPDKHwoQ6s; Path=/; HttpOnly
X-Powered-By:Express
Run Code Online (Sandbox Code Playgroud)
它应该工作,对吗?
但随后的请求仍然失败并出现错误 XMLHttpRequest cannot load http://qualifiedlocalhost:8888/resource.json. Origin http://localhost:9000 is not allowed by Access-Control-Allow-Origin.
Request URL:http://qualifiedlocalhost:8888/resource.json
Run Code Online (Sandbox Code Playgroud)
请求标题
Accept:application/json, text/plain, */*
Cache-Control:no-cache
Origin:http://localhost:9000
Pragma:no-cache
Referer:http://localhost:9000/
User-Agent:Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.71 Safari/537.36
X-Requested-With:XMLHttpRequest
Run Code Online (Sandbox Code Playgroud)
也许它正盯着我.但是,任何想法?以防它是相关的...我正在使用AngularJS $resource
并与CompoundJS服务器交谈.
KAR*_*N.A 13
更改您的Access-Control-Allow-Methods:'GET,POST'到'GET,POST,PUT,DELETE'
之前:
app.use(function(req, res, next) {
res.setHeader('Access-Control-Allow-Origin', '*');
res.setHeader('Access-Control-Allow-Methods', 'GET, POST');
res.setHeader('Access-Control-Allow-Headers', 'X-Requested-With,content-type, Authorization');
next();
});
Run Code Online (Sandbox Code Playgroud)
后:
app.use(function(req, res, next) {
res.setHeader('Access-Control-Allow-Origin', '*');
res.setHeader('Access-Control-Allow-Methods', 'GET, POST, PUT ,DELETE');
res.setHeader('Access-Control-Allow-Headers', 'X-Requested-With,content-type, Authorization');
next();
});
Run Code Online (Sandbox Code Playgroud)
我最近遇到了同样的问题.问题是,在Access-Control-Allow-Origin
头(如果你使用它,将Access-Control-Allow-Credentials
头)必须在发送两个预检响应和实际响应.
您的示例仅在预检响应中具有此功能.
您的Web服务器/获取功能是否还包括HTTP标头:Access-Control-Allow-Origin?我最终使用AngularJS 1.0.7和远程Java servlet获得了成功.这是我的Java代码片段 - AngularJS客户端不需要进行任何更改:
Servlet的:
@Override
protected void doOptions(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// Send Response
super.doOptions(request, response);
response.setHeader("Access-Control-Allow-Origin", "*");
response.setHeader("Access-Control-Allow-Headers", "Content-Type, X-Requested-With");
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
/* ... */
response.setHeader("Access-Control-Allow-Origin", "*");
}
Run Code Online (Sandbox Code Playgroud)
更优雅的替代方案是servlet过滤器.
我们已经注意到同样的问题,服务器发送正确的 CORS 标头,但浏览器失败,因为它认为没有满足 CORS 要求。更有趣的是,在我们的例子中,它只发生在同一个浏览器会话中的一些 AJAX 调用上,而不是全部。
清除浏览器缓存解决了我们的问题——我目前的工作理论是,这与跨源服务器设置的 cookie 有关。我注意到在你的场景中,有一个 cookie 被设置为对飞行前 OPTIONS 请求的响应的一部分。您是否尝试过让该服务器不对来自不同来源的请求设置任何 cookie?
但是,我们注意到在某些情况下,重置浏览器后问题再次出现。此外,以私密模式运行浏览器会导致问题消失,这表明浏览器缓存中存在一些问题。
作为参考,这是我的场景(我几乎将其发布为 SO 中的一个新问题,但将其放在这里):
我们遇到了一个错误,其中一些通过 jQuery.ajax 发出的 CORS GET 请求失败。在给定的浏览器会话中,我们看到飞行前 OPTIONS 请求通过,然后是实际请求。在同一个会话中,一些请求通过,而另一些请求失败。
浏览器网络控制台中的请求和响应序列如下所示:
首先是 OPTIONS 飞行前请求
OPTIONS /api/v1/users/337/statuses
HTTP/1.1 Host: api.obfuscatedserver.com
Connection: keep-alive
Access-Control-Request-Method: GET
Origin: http://10.10.8.84:3003
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.95 Safari/537.36
Access-Control-Request-Headers: accept, origin, x-csrf-token, auth
Accept: */* Referer: http://10.10.8.84:3003/
Accept-Encoding: gzip,deflate,sdch Accept-Language: en-US,en;q=0.8
Run Code Online (Sandbox Code Playgroud)
得到这样的回应,
HTTP/1.1 200 OK
Date: Tue, 06 Aug 2013 19:18:22 GMT
Server: Apache/2.2.22 (Ubuntu)
Access-Control-Allow-Origin: http://10.10.8.84:3003
Access-Control-Allow-Methods: GET, POST, OPTIONS, PUT
Access-Control-Max-Age: 1728000
Access-Control-Allow-Credentials: true
Access-Control-Allow-Headers: accept, origin, x-csrf-token, auth
X-UA-Compatible: IE=Edge,chrome=1
Cache-Control: no-cache
X-Request-Id: 4429c4ea9ce12b6dcf364ac7f159c13c
X-Runtime: 0.001344
X-Rack-Cache: invalidate, pass
X-Powered-By: Phusion
Passenger 4.0.2
Status: 200 OK
Vary: Accept-Encoding
Content-Encoding: gzip
Run Code Online (Sandbox Code Playgroud)
然后是实际的 GET 请求,
GET https://api.obfuscatedserver.com/api/v1/users/337
HTTP/1.1
Accept: application/json, text/javascript, */*; q=0.01
Referer: http://10.10.8.84:3003/
Origin: http://10.10.8.84:3003
X-CSRF-Token: xxxxxxx
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.95 Safari/537.36
auth: xxxxxxxxx
Run Code Online (Sandbox Code Playgroud)
在浏览器控制台中出现错误,例如,
XMLHttpRequest
cannot load https://api.obfuscatedserver.com/api/v1/users/337.
Origin http://10.10.8.84:3003 is not allowed by Access-Control-Allow-Origin.
Run Code Online (Sandbox Code Playgroud)
附加调试
我可以通过 curl 重放相同的序列,并且我看到来自服务器的有效响应。即他们有应该让请求通过的预期 CORS 标头。
在私密/隐身浏览器窗口中运行相同的场景没有重现该问题。这导致我尝试清除缓存,这也使问题消失了。但过了一会儿,又回来了。
该问题在 iPhone Safari 以及 OSX 桌面版 Chrome 上重现。
我真正需要帮助的是什么
我怀疑在跨域域中设置了一些 cookie,这些 cookie 涉及到这里并可能暴露浏览器中的错误。我可以在浏览器(本机堆栈?)中设置工具或断点来尝试进一步调试吗?评估 CORS 策略的代码中的断点将是理想的。
归档时间: |
|
查看次数: |
39924 次 |
最近记录: |