登陆拦截 [用户登陆状态保持]
当用户访问服务器的其他页面时, 需要先验证用户之前是否登陆过, 如果登陆过,就放行, 如果没有登陆跳转到登录页进行登陆;
登陆过用户: 要啥给啥
没有登陆过: 只给登录页
- http协议是无状态的
- cookie 和 session
1- http协议是无状态的
- http协议是无状态,无记忆的,在早期互联网中,基本都是静态页面,只要用户输入正确网址,服务器就会返回页面给用户浏览;
- 后来随着互联网发展, 出现了一些会员制网址, 购物网、相亲网址、 博客…, 就需要区分用户;
- http 无记忆无状态: 同一个用户的多次请求之间 毫无关系;
为了解决 服务器 不识别用户问题, 浏览器 中拓展cookie容器,服务器 拓展 session容器;
cookie 和 session
- cookie 浏览器中存储数据的容器;
容量小, 操作麻烦, cookie中的数据在每次请求服务器时,会自动发送给服务器使用;
sessiion: 服务器中存储数据的容器;
cookie 和session 配合 识别用户的?
- 当用户第一次到服务器, 服务器 会给当前用户开启一个单独session空间, 用于记录当前用户信息, 还会给当前用户生成一个唯一标识, 把标识通过响应报文传递给浏览器cookie;
- 在第二次用户访问服务器, 会携带cookie中存放标记到服务器, 此时服务器即可识别用户;
session: 记录用户信息, 给用户生成标识
cookie: 存放标识,发送标识到服务器
登陆拦截 [用户登陆状态保持]
- 在用户登陆成功时, 给登陆成功用户在session添加要给登陆成功的标记;
- 后续用户在访问其他页面时, 要判断当前用户 是否有登陆成功标记, 如果有 放行, 如果没有去登陆页;
退出:
删除用户在服务器中登陆成功的标记;
cookie-session 登陆状态保存
http协议是无状态的
多次请求之间没有关系cookie
siession
express-session使用
- 下载
npm i express-session
- 导入
const session = require("express-session")
- 使用session中间件
app.use(session({
// 给cookie中存储的sessionid加密的, 可以随意指定一个字符串
secret: 'itcast',
// 设置浏览器端cookie中的sessionId设置名字, 默认connect.sid
name: 'sessionId',
resave: false,
// 在浏览器和服务器连接的第一时间,分配session 给浏览器指定一个cookie
saveUninitialized: true
}))
可以通过req.session访问到session
4. 登录成功,把登录成功的用户信息存储到 req.session.xxx中
db.findUser(username, password, result => {
if (result.length > 0) {
// 登录成功
// 登录成功了,把当前用户的信息,保存到req.session中
req.session.user = req.body
res.redirect('/')
} else {
res.redirect('/login')
}
})
5. 提供一个中间件,这个中间件在路由的前面,判断 req.session.xxx是否有值,有值,放走,没值,去登录,细节: 如果是/login 直接放走
app.use((req, res, next) => {
if ( !req.session.user && req.url !== '/login' ) {
res.redirect('/login');
} else {
next();
}
});
6. 退出功能: 把req.session.xxx 清空即可
// 把session中的用户信息清空
req.session.user = null
// 跳到登录页
res.redirect('/login')