首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在Express.js和Node.js中,会话是如何工作的?

在Express.js和Node.js中,会话是如何工作的?
EN

Stack Overflow用户
提问于 2011-04-02 16:09:59
回答 1查看 58.8K关注 0票数 100

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

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

我基本上希望能够看到用户是否登录了,即使用户当时并不在网站上(就像当你在其他网站上时facebook是如何知道你已经登录的)。但是我想我应该首先理解会话是如何工作的。

EN

回答 1

Stack Overflow用户

发布于 2012-07-21 03:31:55

概述

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

详细信息

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

客户端

签名cookie始终用于会话,因此Cookie值将采用以下格式。

代码语言:javascript
复制
[sid].[signature]

其中sid是sessionID,并且签名是通过使用在初始化会话中间件时提供的秘密密钥对sid进行签名而生成的。执行签名步骤是为了防止篡改。在不知道所使用的密钥的情况下修改sid然后重新创建签名在计算上应该是不可行的。如果不需要修改sid,会话cookie仍然容易被窃取和重复使用。

此cookie的名称为

代码语言:javascript
复制
connect.sid

服务器端

如果处理程序发生在cookieParsersession中间件之后,它将可以访问变量req.cookies。它包含一个JSON对象,它的键是cookie键,值是Cookie值。这将包含一个名为connect.sid的密钥,它的值将是签名的会话标识符。

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

代码语言:javascript
复制
app.get("/*", function(req, res, next) {

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

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

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

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

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

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

该示例来自Express 2.5。

票数 174
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5522020

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档