session
cookie:
优点:
1.存储在客户端,不占用服务器资源
缺点
1.只能是字符串格式
2.存储量有限
3.数据容易被获取
4.数据容易被篡改
5.容易丢失
session
存储位置:存储在服务器端
优点
1. 可以是任何格式
2. 存储量理论上是无限的
3. 数据难以被获取
4. 数据难以篡改
5. 不易丢失
缺点
1.占用服务器资源
session原理示意图:
session使用
const session = require('express-session');
app.use(session({
secret: 'wanxinlun',
name: 'sessionis'
}))
在登陆的时候应用session:
router.post("/", asyncHandler(async (req, res) => {
const reslut = await admainService.loginId(req.body.loginId, req.body.loginPwd);
if (reslut) {
let value = reslut.id
value = cryptor.encrypt(value.toString());//加密
console.log(req.session);
req.session.loginUser = reslut;
res.cookie('token', value, {
path: "/",
domain: "localhost",
maxAge: 7 * 24 * 3600 * 1000,//毫秒数
httpOnly: true,
});
res.header('authorization', value)
// res.header("set-cookie", `token=${reslut.id};path=/;domain=localhost;max-age=3600`)
}
return reslut;
}))
登录操作控制台输出的结果:
点击修改学生的操作:
//用于解析token
module.exports = (req, res, next) => {
const apis = needTokenApis.filter(api => {
const reg = pathToRegexp(api.path);
if (api.method === req.method && reg.test(req.path)) {
return true;
}
return false;
})
console.log(apis);
if (apis.length === 0) {//不需要认证
next();
return;
}
let token = req.cookies.token;
if (!token) {
//从header的authorization中获取
token = req.headers.authorization
}
if (!token) {
//没有认证过
handleNoToken(req, res, next);
console.log('认证不通过');
return;
}
const userid = cryptor.decrypt(token);//拿到token进行解密
req.userid = userid;
//验证token
console.log(req.session);
console.log('认证通过', userid);
next();
}
输出结果: