113Express-session和cookie登陆

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')
    })
}
©️2020 CSDN 皮肤主题: 技术黑板 设计师:CSDN官方博客 返回首页