session 原理、node 实现 session 与 express 实现 session
2017年06月11日
原理
session 存在的意义,是为了解决 HTTP 是与状态协议所带来的问题。但是服务端和客户端可以通过 cookie 来进行交互,session 的原理便是将 session_id 存储在客户端的 cookie 中,然后客户端每次请求 HTTP 时,便会发送 cookie,然后服务端通过 session_id 便可将数据关联起来。
node 原生代码实现逻辑
- 用户访问网页时,如果 cookie 中不存在 session_id 字段,则处于没有登录的状态
- 客户输入用户名和密码登录之后,如果服务端验证成功,则会随机生成一串字符串作为键,值中保留用户名,存在内存中
- 然后服务端通过
set-cookie
将 session_id 通过 cookie 保存在客户端中,如有需要,可以配置过期时间参数 - 客户端之后访问中,便会将 cookie 通过首部传入服务端中,服务端通过识别判断出客户端是处于登录状态,便返回对应登录的信息
- 如果客户端选择注销登录,那传入服务端后,服务端便删除存储在全局对象的中此键
简要代码
服务端登录之后生成 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});