状态保持
- 状态保持的概念
- session
- JWT
状态保持的概念
所谓状态保持,就是指保存用户的登陆状态。用户在一定时间内,如果再次打开网站,那么就不需要再次登陆。因为登陆的状态已经在上一次登陆中被保存下来了,但是,这个状态的保存不是永久的,一般会有一个时间。
最早的时候,要实现状态的保持,最常见的就是:
- cookie:所谓 cookie,是将用户的信息保存在客户端,下一次用户再访问网站的时候,会自动携带 cookie 到服务器端。
- session:将用户的数据存储在服务器端,客户端返回一个 sessionID,下一次用户再次访问该网站的时候,会自动携带 sessionID 到服务器,服务器根据这个 sessionID 来找到对应的用户的数据。
session
session 是用于记录用户登录状态的一种机制。不同于 cookie,session 的数据是保存在服务器端,然后往客户端返回一个 sessionID。下一次请求的时候,会带上这个 sessionID,从而从服务器中找到对应的数据。
session 具体示例如下:
这里我们会使用到 express-session 这个中间件,该中间件有一些常见的配置:
name: 默认'connect.sid',可自定义。
store: session 储存器实例。
secret: 用于对 cookie 进行签名 ,通过它可以判断出客户是否修改了 cookie,这是处于安全考虑,这个参数是任意字符串。
cookie: 对 session cookie 的设置 。默认值'{ path: '/', httpOnly: true, secure: false, maxAge: null }'。
genid: 是个函数,调用它来生成一个新的会话ID。(默认:使用UID2库)。
rolling: 强制对每个响应的 Cookie,重置到期日期。(默认:false)。
resave: 每一次都重新保存,即使没修改过(默认:true)。
proxy: ture/false,是否支持 trust proxy,,需要设置'app.enable("trust proxy")'。一般来说,无需设置。
session 对象常用方法如下:
session.destroy(): 删除 session,当检测到客户端关闭时调用。
session.reload(): 当 session 有修改时,刷新 session。
session.regenerate(): 将已有 session 初始化。
session.save(): 保存 session。
示例代码如下:
const express = require('express');
const app = express();
const session = require('express-session');
const cookieParser = require('cookie-parser')
//中间件使用session
app.use(session({
// 参数配置
secret: 'luckystar', // 加密字符串
name: 'userid', // 返回客户端 key 的名称,默认为 connect_sid
resave: false, // 强制保存session,即使它没有变化
// 强制将未初始化的 session 存储。当新建一个 session 且未设定属性或值时,它就处于未初始化状态。
// 在设定 cookie 前,这对于登录验证,减轻服务器存储压力,权限控制是有帮助的,默认为 true
saveUninitialized: true, // 保存未初始化的 session,即使没有用到 session,也会产生 session 并且保存
cookie: {
maxAge: 50000
},
rolling: true, // 在每次请求时进行设置 cookie,将重置 cookie 过期时间
// 将 session数据存储到 mongo 数据库中
// store:new mongoStore({
// url:'mongodb://127.0.0.1/admin', // 数据库地址
// touchAfter:24*3600 // 多长时间往数据库中更新存储一次,除了在会话数据上更改了某些数据除外
// })
}));
app.get('/', (req, res) => {
// 获取 session
if (req.session.username) {
res.send('欢迎 ' + req.session.username + ' 回来')