什么为会话状态?
客户端与服务端通讯过程中产生的状态信息(类似会议记录),称之为会话状态.
回话是如何存储的?
- 客户端浏览器与服务端通讯时使用的是http协议,这个协议本身是无状态协议,也就是说通过此协议,无法存储回话状态
- 此时在服务端与客户端就采用了一种Cookie/Session/sessionstorage/localstorage方式记录回话状态
**cookie: **
**sessionstorage: ** 针对当前窗口有效,一但关闭数据丢失
**localstorage: ** 默认在浏览器中,持久化存储在
回话技术分析
Cookie:
Cookie是由服务端创建,但在客户端存储回话状态的一个对象,用户在cookie有效的声明周期内,浏览器在访问具体的某个域名时,会携带这个域名下的有效cookie到服务器它只能存入少量信息; 此对象分为两种类型:
规则:
- 回话Cookie:浏览回话结束时(关闭浏览器),生命周期结束,Cookie则会销毁(一般默认都是会话Cookie)
- 持久Cookie 创建时指定了声明周期;例如一周时间,即便浏览器关闭,持久Cookie依旧有效
- Cookie前端默认最多默认存储4k大小
- Cookie 功能可以被浏览器禁用
- Cookie 同一个根域才可传递(顶级)
Session
Session技术由服务端创建,并在服务端储存回话状态的一个对象,可以存储大量的数据(Session默认声明周期为30分钟);
Cookie与Session的区别
Cookie在前端声明周期结束时则就会消失,而Session是存在后端的声明周期结束才会消失
知识扩展
同根域名下,才可以携带cookie信息或者Session信息;如果两个不同的域名下http是无法携带的;
- 但是可以通过将Session或cookie的信息写在http的头信息里,当跨域请求时,由前端取出,在访问时将Session或cookie的信息写到新的域名下即可实现多域名请求同一个cookie或Session
- 也可以将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服务器查该用户信息即可解决该问题(分布式适合于中小型企业)
无状态的会话技术分析
说明
- 由于N多台服务器访问同一个Redis数据库,所以假如并发比较大,数据库的访问压力就会剧增,压力太大有可能会导致系统宕机,如何解决呢?
- 客户端禁止、不支持、不同域等携带cookie到后端将无法实现,项目的登录功能,这时候应该怎么解决?
解决实现:
有一种方案就是将用户的登录状态信息都存储在客户端的头信息里,服务端不记录任何状态,只负责对客户端传递过来的状态信息进行解析,基于此方式进行用户登录状态的判断,这样的会话过程称之为无状态会话,这样大大减少了高并发对服务器或数据库的压力。当然在前端虽然保存了用户的信息,但是是经过加密的这种实现我们可以使用JWT,使用户和服务器之间传递安全可靠的信息(关于JWT说明在另外一个帖子里);
当用户携带者加密的用户状态信息后访问服务器,服务器只需解析加密的数据即可取到用户的登录状态和用户信息
向这样的思想就是单点登录系统,如果用户在一台服务器登录,那么所有集群的服务器都可以实现登录(分布式大型公司用的最多)