【发布时间】:2020-03-20 09:27:57
【问题描述】:
我有以下代码在 http 中生成 cookie,稍后我希望 cookie 能够被 websocket (ws) 读取
问题是当我通过 localhost 打开页面时,cookie 能够由 http nodejs 控制器生成,并且 ws 能够访问 cookie。
但是,当我通过IP地址例如192.168.0.3打开http时,我可以看到cookie是由http生成的,但是ws无法读取它。我检查了 ws 的请求标头,但不包括 cookie。 上述场景在 Chrome 浏览器上运行良好,但在 Safari 13.0.3 上无法运行
以下是我生成http cookie的代码(我使用koa2)
ctx.cookies.set('token', token, {
httpOnly: false,
expires: expiryDate,
})
以下是我在nodejs中读取cookie的方式
let cookies = new Cookies(req, null);
console.log(JSON.stringify(req.headers)); //The header does not contain cookie in Safari 13.0.3 with IP address but in Chrome I can see the header has cookie
let token = cookies.get('token');
console.log('Cookie token is: ' + token); //token value is undefined
请帮忙。
【问题讨论】:
-
您是否对创建 cookie 的 http 请求和 webSocket 连接使用完全相同的 URL?请显示这两个的代码。
-
是的,网址完全相同。该代码具有以下逻辑: 1. 控制器生成 cookie 并在打开 html 页面的位置返回响应 2. html 页面具有调用 ws 后端的 javascript,该后端与控制器位于同一文件夹中。 3. ws读取html javascript传入的请求中的cookie。
-
Safari 以不发送带有 webSocket 连接的
httpOnlycookie 而闻名,但看起来您并不想设置httpOnly。但是,也许需要验证。