快速会话Cookie管理

时间:2016-08-31 05:49:00

标签: javascript session cookies

我很难理解express-session包中生成的Cookie的作用。

所以在下面的代码中:

var session = require('express-session')
var store = require('session-file-store')(session)

app.use(session({
    name: 'session-id',
    secret: 'sdafjlkdashf34khrjke'
    saveUninitialized: true,
    resave: true,
    store: new Store()
})

func auth (req, res, next) {
    if (!req.session.user) {
        req.session.user = 'admin'
        next()
    }else {
        console.log(req.session)
    }
}

app.get('/', function (req, res) {
  res.send('Hello World!');
});

app.listen(3000, function () {
  console.log('Example app listening on port 3000!');
});

所以基本上在上面的简单代码片段中,每当用户向服务器发出请求时(例如:localhost:3000/),就会发生3件事情:

  1. 将为该特定客户端创建一个新的会话对象。
  2. 在该新会话对象中,将自动为该特定客户端附加cookie。
  3. 最后因为我正在使用session-file-store,所以只有cookie信息(不是会话对象)才会保存到本地计算机上的session文件夹中。
  4. 现在让我们说50个cookie对象存储在session个文件夹中,因为50个客户端向我的服务器发出了请求。

    所以我的问题是,每当这50个用户中的一个向我的服务器发出另一个请求时,express-session如何知道选择哪个cookie对象(来自session文件夹)并附加到{{ 1}}在代码中使用的对象。

1 个答案:

答案 0 :(得分:1)

会话对象是一个常规JavaScript对象,您可以在其中存储(合理地)特定会话的通用信息。

会话由唯一标识符,会话密钥或会话ID标识。 是存储在Cookie中的内容,用于将客户端与会话文件相关联。

以下是为我设置的示例Cookie:

set-cookie: session-id=s%3AvdD2a8WqJD3R5L5UjZ_oWDkWMVbEa8UF.%2BXjKW6hIaX%2FfDAJm2lSZrEJ0xFigoeHjru1rZT7Na0E

它由四部分组成(为了清楚起见,我对其进行了解码):

  • s::由express-session设置的前缀,表示会话Cookie已签名;
  • vdD2a8WqJD3R5L5UjZ_oWDkWMVbEa8UF:唯一标识符。如果查看存储会话的目录,您将找到该名称的JSON文件;
  • .:会话ID和签名之间的分隔符;
  • +XjKW6hIaX%2FfDAJm2lSZrEJ0xFigoeHjru1rZT7Na0E:Cookie签名(以防止篡改);

因此,Cookie本身并不包含任何会话信息,这些信息都存储在文件中。

以下是会话文件的示例:

{
  "cookie": {
    "originalMaxAge": null,
    "expires": null,
    "httpOnly": true,
    "path": "/"
  },
  "value": 1472628829554, // this is a value I stored in the session
  "__lastAccess": 1472628829557
}

就Cookie而言,域名指的是Cookie所属的域(或网站)。如果example.com设置了Cookie,则Cookie会绑定到该域,并且只会发送到该网站。但是,这与识别发送cookie的客户端没有任何关系,这是会话ID的工作。