5. Session

1. 简介

是另一种记录客户状态的机制,保存在服务器上面,所以当访问量增多的时候,会比较占用服务器的性能。

2. 工作流程

当浏览器访问服务器并发送第一次请求时,服务器端会创建一个session对象,生成一 个类似于 key,value 的键值对, 然后将 key(cookie)返回到浏览器(客户)端,浏览器下次 再访问时,携带 key(cookie),找到对应的 session(value)。

3. 使用

express中需要用到express-session模块

  1. // 1.引入依赖
  2. const session = require('express-session')
  3. // 2.设置中间件
  4. app.use(session({
  5. secret: 'keyboard cat',
  6. resave: true,
  7. saveUninitialized: true
  8. }))
  9. // 3. 使用
  10. req.session.username = '张三'
  11. // 4.获取
  12. const {username} = req.session

4. 常用参数

  1. app.use(session({ secret: '12345', name: 'name', cookie: {maxAge: 60000}, resave: false, saveUninitialized: true }));
参数 作用
secret 一个 String 类型的字符串,作为服务器端生成 session 的签名
name 返回客户端的 key 的名称,默认为 connect.sid,也可以自己设置。
resave 强制保存 session 即使它并没有变化,。默认为 false。 don’t save session if unmodified
saveUninitialized 强制将未初始化的 session 存储。当新建了一个 session 且未设定属性或值时,它就处于未初始化状态。在设定一个 cookie 前,这对于登陆验证,减轻服务端存储压力,权限控制是有帮助的。(默认:true)。建议手动添加。
cookie 设置返回到前端 key 的属性,默认值为{ path: ‘/’, httpOnly: true, secure: false,maxAge: null }
rolling 在每次请求时强行设置 cookie,这将重置 cookie 过期时间(默认:false)

5. 销毁session

  1. req.session.destroy(err) {
  2. if (err) {
  3. // todo
  4. }
  5. }

6. 实践-负载均衡配置session,把session保存到数据库

分布式部署服务器时,由于每次请求的服务器可能不同,session如果只存在于服务器上面,可能会导致session丢失,因此需要将其存储在数据库中

5.session - 图1

  1. // 1. 引入依赖
  2. const session = require("express-session");
  3. const MongoStore = require('connect-mongo')(session); // 需要将session传入
  4. // 2. 配置中间件
  5. app.use(
  6. session({
  7. secret: 'keyboard cat',
  8. resave: false,
  9. saveUninitialized: true,
  10. rolling: true,
  11. cookie: { maxAge: 100000 },
  12. store: new MongoStore({ url: 'mongodb://127.0.0.1:27017/student', touchAfter: 24 * 3600 }) // 在24小时内,不管发多少次请求,除非session改变,否则都不更新
  13. })
  14. );
  15. // 3. 获取session
  16. //会自动从数据库里面拿session,正常获取即可
  17. const {username} = req.session