我正在使用$ .ajax发出ajax请求。响应具有Set-Cookie标题集(我已经在Chrome开发工具中对此进行了验证)。但是,浏览器在收到响应后 不会 设置cookie!当我导航到域中的另一个页面时,不会发送cookie。(注意:我没有执行任何跨域ajax请求;该请求与文档位于同一域中。)
Set-Cookie
我想念什么?
编辑 :这是我的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
好的,所以我终于找到了问题所在。事实证明,Path在AJAX请求中发送cookie时,设置选项很重要。如果设置Path=/,例如:
Path
Path=/
Set-Cookie:SessionId=foo; Path=/; HttpOnly
…然后,当您导航到其他页面时,浏览器将设置cookie。如果不设置Path,浏览器将使用“默认”路径。显然,由AJAX请求设置的Cookie的默认路径与直接导航到页面时使用的默认路径不同。我正在使用Go / Martini,因此在服务器端我这样做:
session.Options(session.Options{HttpOnly: true, Path:"/"})
我猜想是Python / Ruby / etc。具有类似的设置机制Path。