有状态登录与无状态登录开发思想

什么为会话状态?

客户端与服务端通讯过程中产生的状态信息(类似会议记录),称之为会话状态.

回话是如何存储的?

  • 客户端浏览器与服务端通讯时使用的是http协议,这个协议本身是无状态协议,也就是说通过此协议,无法存储回话状态
  • 此时在服务端与客户端就采用了一种Cookie/Session/sessionstorage/localstorage方式记录回话状态

**cookie: **
**sessionstorage: ** 针对当前窗口有效,一但关闭数据丢失
**localstorage: ** 默认在浏览器中,持久化存储在

回话技术分析

Cookie:
Cookie是由服务端创建,但在客户端存储回话状态的一个对象,用户在cookie有效的声明周期内,浏览器在访问具体的某个域名时,会携带这个域名下的有效cookie到服务器它只能存入少量信息; 此对象分为两种类型:

规则:

  1. 回话Cookie:浏览回话结束时(关闭浏览器),生命周期结束,Cookie则会销毁(一般默认都是会话Cookie)
  2. 持久Cookie 创建时指定了声明周期;例如一周时间,即便浏览器关闭,持久Cookie依旧有效
  3. Cookie前端默认最多默认存储4k大小
  4. Cookie 功能可以被浏览器禁用
  5. Cookie 同一个根域才可传递(顶级)

Session
Session技术由服务端创建,并在服务端储存回话状态的一个对象,可以存储大量的数据(Session默认声明周期为30分钟);

Cookie与Session的区别
Cookie在前端声明周期结束时则就会消失,而Session是存在后端的声明周期结束才会消失

知识扩展
同根域名下,才可以携带cookie信息或者Session信息;如果两个不同的域名下http是无法携带的;

  1. 但是可以通过将Session或cookie的信息写在http的头信息里,当跨域请求时,由前端取出,在访问时将Session或cookie的信息写到新的域名下即可实现多域名请求同一个cookie或Session
  2. 也可以将cookie的令牌存到网页头信息里,向不同的域名发送数据cookie信息,服务端读取令牌的值,通过值来找Session下的用户信息

前端带状态回话实现逻辑

单台服务器前端带状态回话

实现方式:
当Session对象创建时,还会创建一个会话Cookie对象,并且通过这个会话Cookie将SessionId写到客户端,客户端下次访问服务端会携带这个会话Cookie,并且通过JsessionId找到Session对象,进而获取Session对象中存储的数据.Cookie默认的生命周期为30分钟.

实现逻辑图:
在这里插入图片描述

多台服务器实现用户对话(服务器集群)

说明一:
有状态的会话 实现分布式架构时,可能会存在很多问题;
例如:浏览器默认不支持携带其它域的Cookie信息进行资源访问,同时服务端的Session默认不能共享

如果按照上面的实现方式,一个前端,访问多台服务器(相同业务相同)。但Session只会在一个服务器保存,当前端访问Nginx时会选择不同的服务器,则这台服务器没有储存这个用户的Session就必须重写登录。所以在用上述所说的逻辑(服务端储存Session)已经不起效果了

解决实现:
当然我们有一种方式可以将session持久化到到一些数据库,例如Redis,下次请求到其它服务器(例如tomcat)时,可以直接从redis中获取登录信息

在用户登录时,首先请求到Nginx服务器,在由Nginx决定访问那台Tomcat服务器,这时服务器生成一个Session对象,然后在储存在Redis数据库中。当该用户再次携带cookie对象访问时,其他服务器可以将cookie进行解析拿到Session的Key,去同一个Redis服务器查该用户信息即可解决该问题(分布式适合于中小型企业)
在这里插入图片描述

无状态的会话技术分析

说明

  1. 由于N多台服务器访问同一个Redis数据库,所以假如并发比较大,数据库的访问压力就会剧增,压力太大有可能会导致系统宕机,如何解决呢?
  2. 客户端禁止、不支持、不同域等携带cookie到后端将无法实现,项目的登录功能,这时候应该怎么解决?

解决实现:
有一种方案就是将用户的登录状态信息都存储在客户端的头信息里,服务端不记录任何状态,只负责对客户端传递过来的状态信息进行解析,基于此方式进行用户登录状态的判断,这样的会话过程称之为无状态会话,这样大大减少了高并发对服务器或数据库的压力。当然在前端虽然保存了用户的信息,但是是经过加密的这种实现我们可以使用JWT,使用户和服务器之间传递安全可靠的信息(关于JWT说明在另外一个帖子里);

当用户携带者加密的用户状态信息后访问服务器,服务器只需解析加密的数据即可取到用户的登录状态和用户信息
向这样的思想就是单点登录系统,如果用户在一台服务器登录,那么所有集群的服务器都可以实现登录(分布式大型公司用的最多)

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值