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(session({
10	secret: 'random string',
11	cookie: { maxAge: null }
12}));
13
14app.get('/', function(req, res){
15	if (req.session.isVisit) {
16		req.session.isVisit++;
17		res.send('第' + req.session.isVisit + '次访问');
18	}	else {
19		req.session.isVisit = 1;
20		res.send('第1次访问');
21		// console.log(req.session);
22	}
23});

参考网址