我对 Express 返回给浏览器的 sessionID 的 cookie 存在一些问题。对于连续请求,接收到的 cookie 不会被传回,因此为每个请求生成一个新 session 。无法维护登录状态。
此问题似乎仅发生在低于 Win10 左右的操作系统上的 IE11 及以下版本(例如:Win7 上的 IE11)。 Edge、Chrome、Safari、FF...没有问题。
更多背景信息: 我们有两个应用程序,例如 one.example.com 和two.example.com。对于来自两个应用程序的请求,应跟踪登录的用户。 可在 Two.example.com 上访问的 MEAN 堆栈返回一天的 set-cookie header ,仅限 HTTP,路径“/”上的域为“.example.com”。
当我加载一个包含 10 个资源的页面时,所有这些请求都会收到一个新的 sessionID cookie。即使在连续页面加载时也是如此。 cookie 永远不会返回到服务器。
来自 Chrome 的 HTTP 跟踪:
GET http://localhost:3000/
HTTP/1.1 200 OK
set-cookie: test=123
set-cookie: webSessionId=s%3Av6R-...
GET http://localhost:3000/lib/bootstrap/dist/css/bootstrap.css
Cookie: test=123; webSessionId=s%3Av6R-...
HTTP/1.1 200 OK
Set-Cookie: test=123
看到Chrome返回了session,第二个请求的express没有返回它
来自 IE 的 HTTP 跟踪: 对第一个请求的资源的响应 请求第二个资源 对第二个请求资源的响应
test123 是我在每个请求上设置的硬编码 cookie(无论是否已返回)...通过使用 res.setHeader('Set-Cookie', 'test=123');
。有一次,我正在研究“set-cookie”和“Set-Cookie”之间的区别(如上面的屏幕截图所示),但这似乎不会影响 IE。
因此,一旦我提供了一个域,我就开始尝试其他 cookie 属性(过期日期、域、路径、安全和 http)... IE 不会返回 test-cookie。 在我们的设置中,“.example.com”确实是一个要求。该域不包含下划线 (_)。在 dev & tst 中,它确实包含一个连字符“two-dev.example.com”。但 IE(11) 问题在prd(two.example.com)上也存在。
有人知道为什么 IE 拒绝返回带有域的 cookie 吗? 这狗屎让我发疯
使用:express 4.13.1;快速 session 1.11.3; cookie解析器1.3.2
最佳答案
我想我找到了原因...我们使用的域是两个字母的域,例如one.xx.yy
& two.xx.yy
。因此,我发现,将 cookie 的域部分设置为 .xx.yy
会导致 IE 忽略该 cookie。
谁能确认这个问题在 IE11 上仍然有效吗?
和/或如何规避这个问题?除了使用其他域的明显作用之外。
关于node.js - NodeJS 和 Express 与 IE 的 cookie 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41698483/