cookie
cookie:浏览器在电脑硬盘中开辟的一块空间,主要供服务器端存储数据。
cookie中的数据是以域名的形式进行区分的。
cookie中的数据是有过期时间的,超过时间数据会被浏览器自动删除。
cookie中的数据会随着请求被自动发送到服务器端。
session
session:实际上就是一个对象,存储在服务器端的内存中,在session对象中也可以存储多条数据,每一条数据都有一个sessionid做为唯一标识
express-session第三方下载使用
npm install express-session
// 在node.js中需要借助express-session实现session功能。
const session = require('express-session');
app.use(session({ secret: 'secret key' }));
// 导入express-session模块
const session = require('express-session');
// 拦截所有配置session secret是固定的词
app.use(session({
secret: 'secret key',
saveUninitialized: false,
cookie: {
maxAge: 24 * 60 * 60 * 1000
}
}));
判断是否登陆成功通过请求对象下的session对象保存
// 将用户名存储在请求对象中
req.session.username = user.username;
// 将用户角色存储在session对象
req.session.role = user.role;
保存完之后下一次提交会自动携带提交到服务器
可以结合req.app.locals将session的信息存到公共区,所有模板可以直接调用、节省了每次拼接模板写一遍参数的问题
req.app就是epress()生成的app可以省略导入express
let user = await User.findOne({ email: email })
// 和数据库的密码比对
if (isValid) {
// 将用户名存储在请求对象中
req.session.username = user.username;
// 将用户角色存储在session对象
req.session.role = user.role;
// 登陆成功
// res.send('dengluchengong')
// 重定向不用writehead 使用express的redirect
// req.app 就是app.js的app
req.app.locals.userInfo = user;
// 对用户的角色进行判断
if (user.role == 'admin') {
res.redirect('/admin/user')
} else {
res.redirect('/home/')
}
} else {
// 登录失败
res.status(400).render('admin/error', { msg: '邮箱地址或者密码错误' });
}
通过use中间件判断是否已经登录,如果没登录不允许访问登录界面之外的其他界面
// 中间件拦截 如果没有登陆就返回到登陆页面,不让其访问其他页面
app.use('/admin', require('./middleware/loginGuard'));
const guard = (req, res, next) => {
if (req.url != '/login' && !req.session.username) {
res.redirect('/admin/login');
} else {
if (req.session.role == 'normal') {
return res.redirect('/home/');
}
next();
}
}
module.exports = guard;
清空session和locals
module.exports = (req, res) => {
// 删除session
req.session.destroy(function () {
// 删除cookie
res.clearCookie('connect.sid');
// 清空userInfo
req.app.locals.userInfo = null;
res.redirect('/admin/login')
})
}