1.为什么Spring会提出Spring Session的project?
-
Spring Session与Traditional Session有何不同?
带着以上两个问题,我们开启今天的话题:
在Web开发中我们会遇见一个常见场景,即是保存当前用户信息,举个例子: 产品对于不同权限或级别的用户,提供的服务和UI都可能有区别,所以对于后端来说,我们需要知道当前访问用户是谁。后端对于此类信息的记录常常使用session而浏览器端则是cookie。
使用Spring Boot的项目,它内置的web容器是Tomcat,常见的还包括jetty、WebLogic等。web容器是用来协助开发人员部署web应用。我们常说的session(Traditional Session)就是由web容器管理,为了建立前后端的连接,后端创建session,其对应的session id会被返回到浏览器端,由cookie进行管理。
注意,以上提到的session是由web容器进行管理,你可以理解成由某一个web服务器进行管理。随着网站的演变,分布式和集群成为趋势,这就意味着,一个前端请求可能被负载均衡到不同的服务器上,此时问题来了,如果一个已经登录过的用户发送请求,被后端响应,传统的session管理方式试用于单例模式,对于分布式的后端服务,系统没办法确定此次请求是否来自一个已登录的用户或是未登录的用户。基于这样的现状,必须提供新的可靠的集群分布式/集群session的解决方案,突破traditional-session单机限制(即web容器session方式,下面简称traditional-session),spring-session应用而生。
我们看一下Traditional Session的工作过程:
Traditional Session
传统模式中,当request进入web容器,根据reqest获取session时,如果web容器中存在session则返回,如果不存在,web容器则创建一个session。然后返回response时,将sessonId作为response的head一并返回给客户端或者浏览器。
Spring Session
但是上文中说明了Traditional Session的局限性在于:单机session。在此限制的相反面,即将session从web容器中抽出来,形成独立的模块,以便分布式应用或者集群都能共享,即能解决。
spring session的核心思想在于此:将session从web容器中剥离,存储在独立的存储服务器中。目前支持多种形式的session存储器:Redis、Database、MogonDB等。session的管理责任委托给spring-session承担。当request进入web容器,根据request获取session时,由spring-session负责存存储器中获取session,如果存在则返回,如果不存在则创建并持久化至存储器中。
网友评论