目录
一、什么是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里面的值
浏览器里面的值
如果session过期之后,redis会是过期session
五、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验证的内容了,后面有机会再学习分享一下。以上。