目录

一、什么是session共享

二、实现session共享的几种方式及一些对比

三、用redis实现session共享

四、浏览器和服务器之间的session是怎么对应上的

五、springboot中是如何整合session共享的

六、题外-jdbc实现session共享


一、什么是session共享

由于web应用请求后台是用的http协议,http是无状态的协议,在服务端就需要使用session来保存一些与会话相关的内容,例如登录信息等。当用户登录了系统之后,用户携带浏览器的cookie来请求,我们便根据cookie获取对应的服务器存入的session信息,这样就实现了服务端对用户的认证。

但是,当我们有多台服务器时怎么办?如果还是使用原来的的方式,session存到服务器上,用户的请求并不是一定会落到已经认证的服务器上,如果请求到了未存到对应session的服务器上,用户还是要进行一次认证,这样的结果肯定不是我们想要的。

session共享就是划分出一个公共区域,让服务器都能够拿到需要的session信息,这样就不会出现用户的请求需要重复认证的情况。

二、实现session共享的几种方式及一些对比

session共享方式对比

实现方式

优点

缺点

Redis实现

1、支持持久化2、支持集群3、内存数据库,读写快

需要单独再维护个redis服务器

JDBC实现

1、方便,直接使用数据库来存储session信息

1、由于session的存取都是依赖数据库,会加多很多的数据库的请求,数据量多了对整体的请求速度应该都会有影响。

2、如果使用hibernate,由于session访问的也是连接数据库的,数据库的session释放会在最外层,会导致在controller层获取的POJO对象处于持久态。

Memcache

1、快速,数据存入内存

 

1、不支持持久化,如果宕机了会导致session信息丢失

三、用redis实现session共享

1、引入依赖

<dependency>
   <groupId>org.springframework.session</groupId>
   <artifactId>spring-session-data-redis</artifactId>
</dependency>

2、添加配置

添加配置有两种方式

(1)在RedisConfig.java里面添加注解

可以设置session的过期时间(单位是秒):@EnableRedisHttpSession(maxInactiveIntervalInSeconds = 1800)

(2)在application.properties中添加spring.session.store-type=redis

四、浏览器和服务器之间的session是怎么对应上的

1、浏览器的cookies里带的session的value进行base64解码之后,就是redis里的session的key值

redis里面的值

redis session 管理 redis实现session_spring

浏览器里面的值

redis session 管理 redis实现session_spring_02

如果session过期之后,redis会是过期session

redis session 管理 redis实现session_redis session 管理_03

五、springboot中是如何整合session共享的

源码没有看完,这里大致讲一下官方文档的翻译,

1、spring会创建一个叫springSessionRepositoryFilter的过滤器,这个过滤器会管理替换了HttpSession实现的Spring Session,spring session的信息会存入redis

2、创建了一个RedisConnectionFactory来连接redis

3、当然,还对httpRequest和httpResponse都进行了包装,让这些对象能携带新的session信息。

具体的实现方式后续再跟进源码分析。

六、题外-jdbc实现session共享

1、依赖

<dependency>
    <groupId>org.springframework.session</groupId>
    <artifactId>spring-session-jdbc</artifactId>
</dependency>

2、配置

在配置文件中添加:spring.session.store-type=jdbc

jdbc实现session共享支持指定datasource,在jdbc的配置类里面注入事先定义好的数据源,再加上@SpringSessionDataSource注解就可以。

3、问题

添加了jdbc实现session共享之后,如果有session信息,controller获取到的POJO类会是持久态的,未添加session共享之前是游离态的对象。

 

后记,其实如果作为前后端分离开发的话,应该使用基于token的方式来进行验证,因为其实app这些不同于web浏览器,并没有cookie,而是需要使用token来保证认证信息的。

嗯,这又是单点登录和token验证的内容了,后面有机会再学习分享一下。以上。