javascript - session 如何在 Express.js 和 Node.js 中工作?

标签 javascript node.js session cookies express

使用 Express.js , session 非常简单。不过我很好奇它们实际上是如何工作的。

它会在客户端上存储一些 cookie 吗?如果是这样,我在哪里可以找到那个 cookie?如果需要,如何解码?

我基本上希望能够查看用户是否已登录,即使当时该用户实际上并未在网站上(例如当您在其他网站上时 facebook 如何知道您已登录)。但我想了解我应该首先了解 session 是如何工作的。

最佳答案

概述

Express.js 使用 cookie 将 session ID(带有加密签名)存储在用户的浏览器中,然后在后续请求中,使用该 cookie 的值来检索存储在服务器上的 session 信息。此服务器端存储可以是内存存储(默认)或任何其他实现所需方法的存储(如 connect-redis)。

详情

Express.js/Connect 创建一个 24 个字符的 Base64使用 utils.uid(24) 的字符串并将其存储在 req.sessionID 中。然后将该字符串用作 cookie 中的值。

客户端

签名 cookie 总是用于 session ,因此 cookie 值将具有以下格式。

[sid].[signature]

其中 [sid] 是 sessionID,[signature] 是通过使用初始化 session 中间件时提供的 key 对 [sid] 进行签名生成的。 签名步骤是为了防止篡改。在不知道使用的 key 的情况下修改 [sid] 然后重新创建 [签名] 在计算上应该是不可行的。如果不需要修改 [sid], session cookie 仍然容易被盗用和重复使用。

这个cookie的名字是

connect.sid

服务器端

如果处理程序出现在 cookieParsersession 中间件之后,它将可以访问变量 req.cookies。这包含一个 JSON 对象,其键是 cookie 键,值是 cookie 值。这将包含一个名为 connect.sid 的 key ,其值将是签名的 session 标识符。

下面是一个如何设置路由的示例,该路由将在每个请求上检查 session cookie 的存在并将其值打印到控制台。

app.get("/*", function(req, res, next) {

    if(typeof req.cookies['connect.sid'] !== 'undefined') {
        console.log(req.cookies['connect.sid']);
    }

    next(); // Call the next middleware
});

您还需要确保在 cookieParsersession 之后包含路由器 (app.use(app.router))在您的配置部分。

以下是 Express.js/Connect 内部存储的数据示例。

{
  "lastAccess": 1343846924959,
  "cookie": {
    "originalMaxAge": 172800000,
    "expires": "2012-08-03T18:48:45.144Z",
    "httpOnly": true,
    "path": "/"
  },
  "user": { 
    "name":"waylon",
    "status":"pro"
  }
}

user 字段是自定义的。其他一切都是 session 管理的一部分。

示例来自 Express 2.5。

关于javascript - session 如何在 Express.js 和 Node.js 中工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5522020/

相关文章:

javascript - 选择某些内容后,Angular ngOptions 列表空白

ruby-on-rails-3 - Rspec 和 Capybara 对象匹配

javascript - OnClick 启动 asp session (单击链接时)

javascript - 根据唯一 ID 合并两个数组

node.js - 如何根据用户输入创建 X 数量的工作线程?

javascript - 如何避免在加载页面时看到 Cufon 字体替换工具的渲染?

javascript - 将 JSON 流式传输到 Redis

session - 如何导出Plone session 配置?

javascript - JqG​​rid Treegrid 不显示为树

javascript - 格式化 View 中的日期输入 Angular JS