1.what
- Session是在服务端保存的一个数据结构,用来跟踪用户的状态, 这个数据可以保存在集群、数据库、文件中
2. why
由于HTTP协议是无状态的协议,所以服务端需要记录用户的状态时,就需要用某种机制来识具体的用户
Seesion:每次认证用户发起请求时,服务器需要去创建一个记录来存储信息。
session 也是类似的道理,服务器要知道当前发请求给自己的是谁。为了做这种区分,服务器就要给每个客户端分配不同的“身份标识”,然后客户端每次向服务器发请求的时候,都带上这个“身份标识”,服务器就知道这个请求来自于谁了。对于浏览器客户端,大家都默认采用 cookie 的方式,保存这个“身份标识”。
服务器使用session把用户的信息临时保存在了服务器上,用户离开网站后session会被销毁。这种用户信息存储方式相对cookie来说更安全。
缺点
当越来越多的用户发请求时,内存的开销也会不断增加。
如果web服务器做了负载均衡,那么下一个操作请求到了另一台服务器的时候session会丢失。
3. Cookie与Session的区别和联系
- cookie数据存放在客户的浏览器上,session数据放在服务器上;
cookie不是很安全,别人可以分析存放在本地的COOKIE并进行 COOKIE欺骗,考虑到安全应当使用session;- session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能。考虑到减轻服务器性能方面,应当使用COOKIE;
单个cookie在客户端的限制是3K,就是说一个站点在客户端存放的COOKIE不能超过3K;- Cookie和Session的方案虽然分别属于客户端和服务端,但是服务端的session的实现对客户端的cookie有依赖关系的,上面我讲到服务端执行session机制时候会生成session的id值,这个id值会发送给客户端,客户端每次请求都会把这个id值放到http请求的头部发送给服务端,而这个id值在客户端会保存下来,保存的容器就是cookie,因此当我们完全禁掉浏览器的cookie的时候,服务端的session也会不能正常使用。
如果说Cookie机制是通过检查客户身上的“通行证”来确定客户身份的话,
那么Session机制就是通过检查服务器上的“客户明细表”来确认客户身份。
4.express-session 配置
不要忘记安装
const session = require('express-session') //中间件 设置密钥 // 签名密钥,加密字符串,会在原有加密基础上和这个字符串进行拼接 // 然后加密 //目的 就是为了增加安全性,防止客户端恶意伪造 app.use(session({ resave:false, saveUninitialized:true, secret:'宝塔镇河妖' // 加密 暗号 session信息会进行加密 防止 被破解 }))
5.登录存储
app.get("/login", function(req, res) { // 完整的判断登录的逻辑 if(req.query.userName =='yzs' &&req.query.psw=="123456"){ // 存储信息 自动生成一个 SID session id req.session.regenerate(function(err){ if(err){ console.log("session错误",err); }else{ //放心不好重复,内部有机制 req.session.userName = req.query.userName req.session.save() // 客户端response 查看 res.send(`登录成功<a href='/'>首页</a> <br> <a href='/logout'>登出</a> `) } }) } else { res.send("用户名 或密码错误<a href='/login.html'> 重新登录</a>") } })
6.验证
app.get("/checkLogin", function (req, res) { if (req.session.userName) { res.send(req.session.userName) } else { res.send("未登录<a href='/login.html'> 重新登录</a>") } })
7.登出
app.get("/logout", function (req, res) { res.clearCookie("connect.sid") req.session.regenerate(function (err) { res.send("退出成功") }) })