在Express中设置客户端可访问的Cookie

34

我正在开发一个使用Express和SocketIO的Node应用程序。我想在我的Express控制器中设置一个cookie,然后可以从客户端JavaScript代码中访问它。但是我尝试的所有方法似乎都不起作用:

res.setHeader('Set-Cookie','test=value');
res.cookie('rememberme', 'yes', { maxAge: 900000 });

这里有什么我错过的吗?提前感谢!


可能有助于展示客户端代码。 - ebohlman
我只是进入Chrome检查器并查看Cookie。但是没有看到任何东西... - dshipper
3个回答

58

我想通了!默认情况下,Express将httpOnly选项设置为true。这意味着客户端JavaScript无法访问您的Cookie。要正确设置可由客户端访问的Cookie,请使用以下代码片段:

res.cookie('rememberme', 'yes', { maxAge: 900000, httpOnly: false});

我也注意到,如果您调用此命令,然后调用res.redirect,cookie将不会被设置。必须在某个时刻跟随此命令调用res.render才能使其正常工作。不确定为什么会这样。


6
你可以通过查看 res.cookies 对象来读取 Express 中的 cookie。例如,名为 session_id 的 cookie 存在于 res.cookies.session_id。请参考链接 http://expressjs.com/api.html#req.cookies。 - frontendbeauty
2
你需要调用res.render或res.send的原因是设置cookie不会启动响应,而send和Render会。这个cookie方法只是将cookie添加到响应对象中。 - mike james
1
请注意,将 httpOnly 标志设置为 false 对于会话 cookie 是危险的。当设置为 false 时,一个恶意的攻击者通过简单的 XSS 脚本注入攻击就可以读取和复制该会话,并使用它从另一台计算机登录目标用户。确保只在不保存任何敏感数据的 cookie 中使用该标志。 - T Nguyen
3
你说的应该是 req.cookies 而不是 res.cookies - chichilatte
@dshipper,我们如何在另一个JS文件中获取这个cookie值? - Punit Gajjar
显示剩余2条评论

5
实际上,我也遇到了相同的问题几个小时。
这是我的代码:
res.cookie("mycookie", "1234567890", { secure:true, maxAge:120000, httpOnly: true });

我可以在响应头中看到Set-Cookie指令,但在Chrome中找不到cookie,并且通过req.cookies['mycookie']也找不到cookie。
这个问题的根本原因是我没有使用HTTPS连接。(Express 4.x与cookie-parser中间件)
根据这份文档:Simple Steps to Secure Your Express Node App 如果我设置secure=true选项,则浏览器将不会在任何HTTP请求中发送我的cookie,而是通过HTTPS安全连接。然后在删除secure:true选项后,我成功地使用了我的cookie。

0

那么要在HTTP中访问,我们可以使用:

res.cookie("mycookie", "1234567890", { secure:false, maxAge:120000, httpOnly: true });?

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接