在 Express 中设置客户端可访问的 Cookie
Posted
技术标签:
【中文标题】在 Express 中设置客户端可访问的 Cookie【英文标题】:Set Client-Side Accessible Cookie In Express 【发布时间】:2012-06-13 13:35:22 【问题描述】:我正在开发一个使用 Express 和 SocketIO 的 Node 应用程序。我想在我的 Express 控制器中设置一个 cookie,然后可以从我的客户端 javascript 代码访问它。我尝试的一切似乎都不起作用:
res.setHeader('Set-Cookie','test=value');
res.cookie('rememberme', 'yes', maxAge: 900000 );
这里有什么我遗漏的吗?提前致谢!
【问题讨论】:
可能有助于显示客户端代码。 我只是进入 Chrome 检查器并查看 cookie。不过什么都没看到…… 【参考方案1】:想通了!默认情况下,Express 将选项 httpOnly 设置为 true。这意味着客户端 Javascript 无法访问您的 cookie。为了正确设置客户端可访问的 cookie,只需使用如下所示的 sn-p:
res.cookie('rememberme', 'yes', maxAge: 900000, httpOnly: false);
我还注意到,如果您调用此命令然后调用 res.redirect,则不会设置 cookie。该命令需要在某些时候跟随 res.render 才能工作。不知道为什么会这样。
【讨论】:
这是一个很好的信息。您是否知道如何在 express 框架中访问服务器端的客户端 cookie? @user644745 您可以通过查看res.cookies
对象来读取 Express 中的 cookie。例如,名为session_id
的cookie 将存在于res.cookies.session_id
。 expressjs.com/api.html#req.cookies
之所以需要调用 res.render 或 res.send 是因为设置cookie不会发起响应。发送和渲染。这个 cookie 方法只是给响应对象添加了一个 cookie。
请注意,将会话 cookie 的 httpOnly 标志设置为 false 是危险的。当设置为 false 时,入侵网站的恶意行为者(例如,通过简单的 XSS 脚本注入攻击)将能够读取和复制该会话,并使用它从另一台计算机以目标用户身份登录。确保只将该标志与不包含任何敏感数据的 cookie 一起使用。
@frontendbeauty 你的意思是req.cookies
不是res.cookies
。【参考方案2】:
实际上,我在几个小时内都遇到了同样的问题。
这是我的代码:
res.cookie("mycookie", "1234567890", secure:true, maxAge:120000, httpOnly: true );
我可以在响应标头中看到 Set-Cookie 指令,但在 Chrome 中我找不到 cookie,并且我无法通过 req.cookies['mycookie'] 找到 cookie。
这个问题的根本原因是我没有使用HTTPS连接。 (Express 4.x with cookie-parser 中间件)
根据本文档:Simple Steps to Secure Your Express Node App
如果我设置选项 secure=true,那么浏览器将不会在任何 HTTP 请求中发送我的 cookie,而是在 HTTPS 安全连接中发送。然后在我删除了 secure:true 选项后,我得到了我的 cookie 工作。
【讨论】:
【参考方案3】:所以我们可以使用http访问:
res.cookie("mycookie", "1234567890", secure:false, maxAge:120000, httpOnly: true );?
【讨论】:
以上是关于在 Express 中设置客户端可访问的 Cookie的主要内容,如果未能解决你的问题,请参考以下文章
无法使用 NodeJS 中的 request 和 express 模块在浏览器中设置 cookie