session登录认证方案--登陆状态的服务端存储(附上node原生开发代码)

1.原理:
session登录认证方案:用户从客户端传递用户名、密码等信息,服务端认证后将信息存储在session中,将session_id放到cookie中。
以后访问其他页面,自动从cookie中取到session_id,再从session中取认证信息。相较于客户端cookie登陆认证方案,服务端存储登陆状态的话,可以提升数据的安全性, 也能够存储更多的内容.
2.如何通过Session来存储登录状态
2.1给每一个用户分配一个无关紧要的值session_id作为为一个标识放到cookie中
2.2在服务端定义一个全局变量作为Session容器
2.3将用户的唯一标识作为key, 用户登录之后就给容器的这个key添加登录状态信息
这样用户的信息就全部存储在服务端而不是客户端了;
最关键的一点:
因为http是无状态,req.session其实每次都是空的,但是我们有维护一个全局变量(用户信息表),那么我们就可以根据cookie中的sessionid找到这个全局变量里 的用户认证信息,赋值给req.session,之后就可以通过req.session.username是否存在来判断用户是否在登陆状态;
考虑特殊情况:
(1)客户端手动删除了cookie,那么服务端获取不到sessionId了,就重新下发新的随机数作为sessionId,并在全局变量(用户信息表)中初始化sessionId的value为空对象,这样客户端是未登录状态的,符合逻辑;
(2)服务端崩溃重启了,那么服务端全局变量里的内容全丢了,用户信息表为空,即便用户带着之前给的sessionId过来,但是我们在用户信息表里没有这个sessionId属性,所以就初始化用户信息表里的sessionId对应的value为空对象;
代码1:initCookieSession函数
对所有的请求,处理的第一步就是准备cookie和session,就是调用initCookieSession函数,去把全局变量里的用户信息赋值给req.session,(如果没登陆,req.session={},如果登陆过,req.session.username=xxx等用户信息是有值的),第二步才是处理静态资源,返回静态网页,第三步才是返回接口api的数据

// 0.准备cookie和session
    initCookieSession(req, res);
  //只要有请求发过来,都去检查下有没有我们下发的cookie,没有的话,我们就下发一个cookie,cookie作为key存入session中,不过session中对应的value只有登陆成功后才
//有的;如果有我们下发的cookie,那就什么都不做,除非换人登陆成功了,session中key对应的value值才去改变;
//req.userId的作用:看有没有我们下发的唯一标识
//SESSION_CONTAINER的作用:session用户信息表,key是cookie,value是具体的用户信息
//req.session便于后续登陆成功时,存储用户具体信息,它是等于SESSION_CONTAINER[req.userId];的
const initCookieSession = (req, res
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值