session 原理、node 实现 session 与 express 实现 session

2017年06月11日

原理

session 存在的意义,是为了解决 HTTP 是与状态协议所带来的问题。但是服务端和客户端可以通过 cookie 来进行交互,session 的原理便是将 session_id 存储在客户端的 cookie 中,然后客户端每次请求 HTTP 时,便会发送 cookie,然后服务端通过 session_id 便可将数据关联起来。

node 原生代码实现逻辑

  1. 用户访问网页时,如果 cookie 中不存在 session_id 字段,则处于没有登录的状态
  2. 客户输入用户名和密码登录之后,如果服务端验证成功,则会随机生成一串字符串作为键,值中保留用户名,存在内存中
  3. 然后服务端通过set-cookie 将 session_id 通过 cookie 保存在客户端中,如有需要,可以配置过期时间参数
  4. 客户端之后访问中,便会将 cookie 通过首部传入服务端中,服务端通过识别判断出客户端是处于登录状态,便返回对应登录的信息
  5. 如果客户端选择注销登录,那传入服务端后,服务端便删除存储在全局对象的中此键

简要代码

服务端登录之后生成 session_id:

 1var sessions = {};
 2
 3if (oUser.user in users && oUser.password == users[oUser.user]) {
 4  var sessionId = Math.random().toString(36).substr(2, 16);
 5  res.setHeader('set-cookie', 'sessionId=' + sessionId);
 6  console.log(sessionId);
 7  sessions[sessionId] = oUser.user;
 8  res.end('success\n' + oUser.user);
 9} else {
10  res.end('wrong!');
11}

请求之后,首先可以检查 session_id,如果存在,将 session_id 添加为 request 的一个属性,相当于 express 中的一个中间件:

1var cookie = req.headers.cookie;
2var sessionId = '';
3if (/sessionId=[a-z0-9]{16}/.test(cookie)) {
4  sessionId = /sessionId=([a-z0-9]{16})/.exec(cookie)[1];
5  if (sessionId in sessions) {
6    req.sessionId = sessionId;
7  }
8}

上面代码就将 session_id 与 username 绑定在一起了,客户端通过 session_id 便可识别用户。

express 实现 session

 1var express = require('express');
 2var session = require('express-session');
 3var morgan = require('morgan');
 4
 5var app = express();
 6app.listen(8888);
 7
 8app.use(morgan('dev'));
 9app.use(
10  session({
11    secret: 'random string',
12    cookie: { maxAge: null },
13  })
14);
15
16app.get('/', function (req, res) {
17  if (req.session.isVisit) {
18    req.session.isVisit++;
19    res.send('第' + req.session.isVisit + '次访问');
20  } else {
21    req.session.isVisit = 1;
22    res.send('第1次访问');
23    // console.log(req.session);
24  }
25});

参考网址