中间件express- session

1、配置express-session

app.use(session({
  secret: 'keyboard cat', // 服务端生成的session签名
  resave: false, // 强制重新保存session,即使它并没有变化
  saveUninitialized: true, // 强制将未初始化的session存储
  rolling: true, // 在未过期时,发送请求将重置session的过期时间
  cookie: { maxAge: 1000 * 60, secure: false },
}))

2、设置和获取session

设置了username为zhangsan,在回到首页后就可以读取到session

app.get('/', (req, res) => {
  if (req.session.username) {
    res.send(req.session.username + '已登陆')
  } else {
    res.send('请先登录')
  }
})
app.get('/login', (req, res) => {
  req.session.username = 'zhangsan'
  res.send('denglu')
})

3、销毁session

三种方法,在进入此页面就执行销毁session,回到首页时将无法读取session

app.get('/loginOut', (req, res) => {
  // 1、将cookie的过期时间设为0。 将销毁所有的session
  req.session.cookie.maxAge = 0 
  // 2、将session设为空
  req.session.username = ''
  // 3、 destroy方法,销毁session
  req.session.destroy()
  res.send('退出登录')
})

分布式系统,多服务器共享session

问题描述:不同服务器之间共享session,只需要将session保存到数据库(mongoDB、redis、MySql)中即可

graph LR

nginx --> A[服务器A]
nginx --> B[服务器B]
nginx --> C[服务器C]
A --保存session1--> D[mongodb数据库]
B --共享session1--> D
C --共享session1--> D

安装connet-mongo

npm install connect-mongo

引入,注意需要在引入session语句的下边

const MongoStore = require('connect-mongo')(session)

配置

app.use(session({
  ... //这里参考上边的session配置
  store: MongoStore.create({
    mongoUrl: 'mongodb://user12345:foobar@localhost/test-app?authSource=admin&w=1', // 此处配置数据库的地址,用户名及密码
    touchAfter: 24 * 3600 // 不管多少次请求,在24小时内只更新一次session,除非更改session
  }),
}))
© Jasonk0 all right reserved,powered by Gitbook该文件修订时间: 2022-07-21 08:53:32

results matching ""

    No results matching ""