cookie-session 登陆状态保存
http协议是无状态的
多次请求之间没有关系cookie 知识点: 登录状态保持 [登录拦截] 当用户在访问服务的其他页面时, 先进行拦截, 要先判断此用户之前是否登录过, 如果登陆过就放行,如果没有登录, 去登陆!
需要了解的两个知识点:
- http协议是无状态的
- cookie 和 session
- 实现登录拦截
1. http协议是无状态的
2. http协议是无记忆无状态
在早期的互联网中, 服务器中存放都是静态页面, 用于展示新闻, 图片信息, 用户只需输入正确网址,即可访问服务器, 此时 服务器是不需要区分用户的;也不会记住用户状态 ,就叫 http协议是无记忆无状态;
后来、随着互联网发展, 出现一些会员制网址: 博客、 相亲网址、 购物网站、 此时 服务器就需要区分用户了!
服务器为了区分用户, 新增cookie和session 技术 来实现服务器 区分用户功能;
http协议是无状态, 在一次请求响应之后,服务器会销毁用户状态,
http协议是无状态的: 两次请求之前 毫无关系;
2- 使用cookie 和 session 来实现服务器区别用户
cookie 浏览器中存储数据的容器
特点: 容量小 操作不方便 在每次请求服务器是, cookie数据会自动添加请求报文,发送给服务器
session 服务器中存储数据容器
cookie和 session 如何实现区别用户:
用户第一次访问服务器,服务器为了区分用户,会给当前用户 开辟单独session空间,来存放用户的信息,还会给用户生成唯一的标识123, 并会把标识123通过响应报文,传递给浏览器的cookie;
用户第二次访问服务器, 用户会携带cookie中标记 去服务器, 服务器直接根据cookie中标记就区分用户了;
session: 1- 开辟空间 记录用户信息 , 2- 给每个用户生成唯一标识
cookie: 1- 存放标记, 2- 把标记发送给服务器
3- 登录拦截: 当用户在访问服务的其他页面时, 先进行拦截, 要先判断此用户之前是否登录过, 如果登陆过就放行,如果没有登录, 去登陆!
1- 在用户登录成功时, 给登陆成功用户, 在服务器的session中添加登录成功标记
2- 在用户访问服务器的其他页面, 要先判断此用户之前是否登录过(就看此用户session中是否有登陆成功标识)
有登陆成功标识,说用户刚才登录过, 就可以正常访问
没有登录成功标识, 说明未登录, 只能去登录页 先进行登陆
4- 代码实现
1- 服务器默认没有开session功能,如果想让服务器使用session 区分用户,需要告诉服务器开启session
使用 express-session 来帮我们操作session
app.use(session({
secret: 'itcast', // 加密字符串 123 * 200 = 24600;
name: 'itcast-id'
}));
2- 在用户登录成功时, 给用户添加成功的标记
req.session.isLogin = true;
3- 用户找服务器要页面是, 先判断用户号是否登录过,如果登录过就放行,否则去登陆
app.use((req, res, next) => {
if (req.session.isLogin || req.url == '/login') {
next();
} else {
res.redirect('/login');
}
})
登录成功时, 在session中 添加 isLogin 标记
请求拦截时, 判断 session中是否有 isLogin 标记
退出是: 销毁session中 isLogin 标记
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')