// app.js
const express = require("express");
const session = require("express-session");
const MongoStore = require("connect-mongo");
const app = express();
app.use(
session({
name: "xxSystem",
secret: "this is session", // 服务器生成 session 的签名
resave: true, // true 每次访问一个接口之后,过期时间就会重新计算
saveUninitialized: true, // 强制为初始化的 session 存储,但是第一次登录前并没有数据(所以刚开始无效)
cookie: {
maxAge: 1000 * 60 * 10,// 过期时间,这里设置的 1h
secure: false, // 为 true 时候表示只有 https 协议才能访问 cookie
},
rolling: true, //为 true 表示 超时前刷新,cookie 会重新计时; 为 false 表示在超时前刷新多少次,都是按照第一次刷新开始计时。
store: MongoStore.create({
mongoUrl: 'mongodb://127.0.0.1:27017/xx_session', // 新创建一个数据库
ttl: 1000 * 60 * 10 // 过期时间和 maxAge 保持一致
}),
})
);
// 设置中间件,session 过期校验
app.use((req,res,next)=>{
// 排除 login 相关的路由和接口,否则会无线循环 login 的重定向,致页面崩溃
if(req.url.includes("login")){
next()
return;
}
if(req.session.user){
// 设置 session{},默认存在内存中
// data 是指 login 接口返回的数据
req.session.user = data[0];
// 重新设置 session 保证更新过期时间 正常起作用
req.session.mydate = Date.now()
next();
}else{
// 这里会出现一个问题,因为一般是前端进行路由跳转
// 在这里后端进行跳转,浏览器会阻止这种行为
res.redirect("/login")
// 可以用如下方法解决:是接口->返回错误码;不是接口->重定向
// req.url.includes("api")?res.status(401).send({ok:0}):res.redirect("/login")
}
})
【Express】登录鉴权
于 2023-10-15 20:42:41 首次发布
334

被折叠的 条评论
为什么被折叠?



