我正在使用 $.ajax 发出 ajax 请求。响应设置了 Set-Cookie
header (我已在 Chrome 开发工具中验证了这一点)。然而,浏览器在收到响应后没有设置cookie!当我导航到域中的另一个页面时,不会发送 cookie。 (注意:我没有执行任何跨域ajax请求;该请求与文档位于同一域中。)
我错过了什么?
编辑:这是我的ajax请求的代码:
$.post('/user/login', JSON.stringify(data));
这是请求,如 Chrome 开发工具所示:
Request URL:https://192.168.1.154:3000/user/login
Request Method:POST
Status Code:200 OK
Request Headers:
Accept:*/*
Accept-Encoding:gzip,deflate,sdch
Accept-Language:en-US,en;q=0.8
Connection:keep-alive
Content-Length:35
Content-Type:application/x-www-form-urlencoded; charset=UTF-8
DNT:1
Host:192.168.1.154:3000
Origin:https://192.168.1.154:3000
Referer:https://192.168.1.154:3000/
User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.154 Safari/537.36
X-Requested-With:XMLHttpRequest
Form Data:
{"UserId":"blah","Password":"blah"}:
回应:
Response Headers:
Content-Length:15
Content-Type:application/json; charset=UTF-8
Date:Sun, 16 Mar 2014 03:25:24 GMT
Set-Cookie:SessionId=MTM5NDk0MDMyNHxEdi1CQkFFQ180SUFBUkFCRUFBQVRfLUNBQUVHYzNSeWFXNW5EQXNBQ1ZObGMzTnBiMjVKWkFaemRISnBibWNNTGdBc1ZFcDNlU3RKVFdKSGIzQlNXRkkwVjJGNFJ6TlRVSHA0U0ZJd01XRktjMDF1Y1c1b2FGWXJORzV4V1QwPXwWf1tz-2Fy_Y4I6fypCzkMJyYxhgM3LjVHGAlKyrilRg==; HttpOnly
请您参考如下方法:
好吧,我终于找到问题所在了。事实证明,在 AJAX 请求中发送 cookie 时,设置 Path
选项非常重要。如果您设置Path=/
,例如:
Set-Cookie:SessionId=foo; Path=/; HttpOnly
...那么当您导航到不同的页面时,浏览器将设置 cookie。如果不设置 Path
,浏览器将使用“默认”路径。显然,AJAX 请求设置的 cookie 的默认路径与直接导航到页面时使用的默认路径不同。我正在使用 Go/Martini,因此在服务器端我这样做:
session.Options(session.Options{HttpOnly: true, Path:"/"})
我猜Python/Ruby/等等。有类似的机制来设置Path
。