【问题标题】:Set Client-Side Accessible Cookie In Express在 Express 中设置客户端可访问的 Cookie
【发布时间】: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。不过什么都没看到……

标签: node.js cookies express socket.io


【解决方案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_idexpressjs.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 });?
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-05-10
      • 2014-03-31
      • 2021-02-04
      • 2019-11-26
      • 1970-01-01
      • 1970-01-01
      • 2020-10-21
      • 1970-01-01
      相关资源
      最近更新 更多