01-session
//session 存储在服务端
// 作用,可以验证用户登录状态,如果登录session存在,可以判断已经登录了,否则需要登录
// session的存在依赖于cookie
// session也有有效期,主要是设置cookie的有效期
// session在nodejs中借助于第三方模块 express-session
// cnpm install express-session --save
// session的用法只要一直操作网站,session的时间要从新计算
// 如果超过session的有效期没有操作网站,那么会自动退出登录状态
let express = require('express');
//1.引入express-session模块
let session = require('express-session');
let app = new express();
app.listen(3000, () => {
console.log('3000running');
});
//2.使用模块
app.use(session({
secret: 'keybord cat', //任意字符串用来加密session
resave: false, //强制保存session,默认true不保存,通常为false
saveUninitialized: true, //将未初始化的session保
cookie: { //设置cookie
// secure:true 指的是https协议
maxAge: 10 * 1000 //保存10s
},
rolling: true //让cookie的有效期重新计时(保证session不过期)
}));
//创建session
app.get('/login', (req, res) => {
//使用/login路由时会存储一条session
req.session.username = 'erge';
res.send('存储了一条session,请查看');
});
//读取session
app.get('/userlist', (req, res) => {
//读取session
console.log(req.session.username);
res.send('欢迎' + req.session.username + '登录网页');
});
02-需求session判断登录
let express = require('express');
//引入express-session模块
let session = require('express-session');
let app = new express();
//使用模块(需要放在使用路由的上面,要不然登陆了还没有使用引入的session模块)
app.use(session({
secret: 'keybord cat', //任意字符串用来加密session
resave: false, //强制保存session,默认true不保存,通常为false
saveUninitialized: true, //将未初始化的session保
cookie: { //设置cookie
// secure:true 指的是https协议
maxAge: 10 * 1000 //保存10s
},
rolling: true //让cookie的有效期重新计时(保证session不过期)
}));
// 需求:先判断是否登录了,如果没有登录重定向到登录页面,如果已经登录了,可以浏览其他页面
// 实现的思路
// 1、在所有的路由前边先拦截所有路由,满足指定的条件,才放开满足条件的路由
// 2、首先要放开登录路由,让用户登录,登录成功之后设置session
// 3、其他路由验证session是否存在,如果存在可以查看该路由页面,否则跳转到登录页面
//1.拦截所有的路由app.use(callback)
app.use((req, res, next) => {
//req 请求 res 响应 next()是一个方法,满足条件知识next() 放行
//req.url http://localhost:3000/login req.url:/login
if (req.url == '/login') {
next(); //放行--就是可以看到login相对应的登录页面了
} else if (!req.session.username) {
//如果没有session则重定向为/login登录页面
res.redirect('/login');
} else {
//表示登录成功之后, 放行
next();
}
});
//创建session
app.get('/login', (req, res) => {
//使用/login路由时会存储一条session
req.session.username = 'ergege';
res.send('存储了一条session,请查看');
});
//读取session
app.get('/userlist', (req, res) => {
if (req.session.username) {
//读取session
console.log(req.session.username);
res.send('欢迎' + req.session.username + '登录网页');
} else {
res.send('请登录');
}
});
app.listen(3000, () => {
console.log('3000running');
});
改造项目项目的登录模块
//1.下载express-session模块
//2.引入express-session模块
//3.使用session模块(记不住可以去npmJS.com搜)
//4.改造login.ejs 让表单提交至http://localhost:9527/admin/dologin
// 给input框加上name
// 在接口中通过req.body接收数据
//5.在路由文件中添加接口
//6.在app.js中拦截路由
//5.用户点击登录页面登录按钮提交的接口
router.post('/dologin', async (req, res) => {
// console.log(req.body);
let { username } = req.body;
///添加用户的时候对密码进行md5加密,在登录的时候也要进行加密,这样才能保证和数据库中的密码一致
let pwd = md5(req.body.pwd);
// 登录的流程
// 1、判断用户名是否存在,如果不存在,提示用户名不存在
// 2、判断输入的用户和密码是否匹配,如果不匹配,提示用户名或者密码错误
//如果输入用户名存在,验证用户名和密码是否匹配
let result = await Users.find({ username, pwd });
// console.log(result); 返回的是一个数组
if (result.length > 0) {
//如果返回的result的长度>0,说明用户名密码匹配
//创建一个session
req.session.username = result[0].username;
res.redirect('/admin/userlist');
} else {
res.send(`<script>
alert("用户名密码错误");
location.href="/admin/login";
</script>`);
}
});
//注意:在此可以对login.ejs的页面使用ajax来判断用户名是否存在
//6.在app.js中拦截路由
//拦截路由(需要放在使用路由的上面)
app.use((req, res, next) => {
//req 请求 res 响应 next()是一个方法,满足条件知识next() 放行
//req.url http://localhost:3000/login req.url:/login
if (req.url == '/admin/login' || req.url == '/admin/dologin' || req.url == '/admin/isusername') {
next(); //放行--就是可以看到login相对应的登录页面了
} else if (!req.session.username) {
//如果没有session则重定向为/login登录页面
res.redirect('/login');
} else {
//表示登录成功之后, 放行
next();
}
});