浏览器不允许我这样做:
1)加载http://localhost:8080/myapp/page1
- >这会将JSESSIONID cookie设置为 path = / myapp 和domain = localhost
2)通过AJAX请求,我打电话给GET http://localhost:3000/login?user=xxx
- >在回复中,Chrome和& Firebug,我看到:Set-Cookie: connect.sid = XXXXXXYYYYYY 路径= / domain = localhost
我期待当我执行另一个ajax调用时,例如http://localhost:3000/anotherCall
(仍然停留在http://localhost:8080/myapp/page1
),浏览器会在其中发送Cookie connect.sid 头。但是,它没有!!
知道为什么吗?两个cookie都属于同一个域,唯一的区别是路径,所以不应该有任何跨域问题。
另外,我尝试在NodeJs响应中设置此标头。相同的结果:
res.header('Access-Control-Allow-Origin', "*");
res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE,OPTIONS');
res.header('Access-Control-Allow-Headers', 'Cookie, Content-Type, Authorization, Content-Length, X-Requested-With');
res.header('Access-Control-Expose-Headers', 'Set-Cookie, X-Powered-By');
检查来自Firebug和Chrome开发工具的Cookie信息,似乎浏览器根本没有存储connect.sid cookie。我想知道它是否假设域名不同(一个是localhost:8080,另一个是localhost:3000 ......)
答案 0 :(得分:3)
如果有人遇到同样的问题。我终于开始工作了:
另外添加标题
res.header('Access-Control-Allow-Credentials', 'true');
在$ .ajax调用中设置xhrFields
:
xhrFields:{ withCredentials:true }
现在,cookie已添加到浏览器中,并在后续请求中发送。