node-22-session

简介: Session是在服务端保存的一个数据结构,用来跟踪用户的状态, 这个数据可以保存在集群、数据库、文件中

1.what


  1. Session是在服务端保存的一个数据结构,用来跟踪用户的状态, 这个数据可以保存在集群、数据库、文件中


2. why


由于HTTP协议是无状态的协议,所以服务端需要记录用户的状态时,就需要用某种机制来识具体的用户

Seesion:每次认证用户发起请求时,服务器需要去创建一个记录来存储信息。

session 也是类似的道理,服务器要知道当前发请求给自己的是谁。为了做这种区分,服务器就要给每个客户端分配不同的“身份标识”,然后客户端每次向服务器发请求的时候,都带上这个“身份标识”,服务器就知道这个请求来自于谁了。对于浏览器客户端,大家都默认采用 cookie 的方式,保存这个“身份标识”。

服务器使用session把用户的信息临时保存在了服务器上,用户离开网站后session会被销毁。这种用户信息存储方式相对cookie来说更安全。

缺点

当越来越多的用户发请求时,内存的开销也会不断增加。

如果web服务器做了负载均衡,那么下一个操作请求到了另一台服务器的时候session会丢失。


3.  Cookie与Session的区别和联系


  1. cookie数据存放在客户的浏览器上,session数据放在服务器上;
    cookie不是很安全,别人可以分析存放在本地的COOKIE并进行 COOKIE欺骗,考虑到安全应当使用session;
  2. session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能。考虑到减轻服务器性能方面,应当使用COOKIE;
    单个cookie在客户端的限制是3K,就是说一个站点在客户端存放的COOKIE不能超过3K;
  3. 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("退出成功")
    })
})




相关文章
|
1月前
|
JavaScript 前端开发 数据库
【Node系列】node中的函数
在Node.js中,函数是一段可重复使用的代码,它可以接受输入(参数),执行一系列操作,并返回一个结果(返回值)。
19 3
|
1月前
|
存储 JavaScript 前端开发
Node 中的 AsyncLocalStorage 的前世今生和未来(一)
作者系统详实的介绍了什么是AsyncLocalStorage、如何使用、Node 是如何实现的 AsyncHook等。不论你是0基础还是对此API有些了解的读者都比较适合阅读此文。(文末有活动)
|
1月前
|
JavaScript 前端开发 Java
Node 中的 AsyncLocalStorage 的前世今生和未来(二)
作者系统详实的介绍了什么是AsyncLocalStorage、如何使用、Node 是如何实现的 AsyncHook等。不论你是0基础还是对此API有些了解的读者都比较适合阅读此文。(文末有活动)
|
1月前
|
JavaScript 前端开发
node总结(一)
node总结(一)
|
1月前
|
JavaScript 前端开发 Linux
2020你应该知道的Node配置
2020你应该知道的Node配置
59 1
|
Web App开发 运维 JavaScript
Node的介绍
Node的介绍
135 0
|
缓存 前端开发 JavaScript
Node 案发现场揭秘
Node 案发现场揭秘
|
前端开发
(node:10712) UnhandledPromiseRejectionWarning: #<Object>
在学习node的时候,运行代码突然报下面错误,这个在百度上找了一下,发现描述的有点不正确。这个错误是说不能够处理promise的reject,通俗一点,就是你的promise抛了一个异常出来,但是你调用者没有进行捕获处理,也就是没有写catch()函数来进行捕获。
(node:10712) UnhandledPromiseRejectionWarning: #<Object>