对于分布式的应用来说,用户的会话管理通常有Session Stick,Session复制,Session集中管理,基于Cookie管理四种方式。各自点评一下:
Session Stick
需要某个用户的会话与某台服务器想绑定,有点耦合Session复制
每台服务器都有全部的会话信息,会话同步需要时间,另外每台服务器都有全量数据也是个问题Session集中管理
单独的会话服务,不需要同步,但是同样有网络开销,另外需要处理单点问题基于Cookie管理
把session数据放在cookie中,增加网络载荷,另外也存在安全问题。
本文主要关注集中式Session方面,其实现主要有两种方案,一种是容器相关的,比如基于Tomcat的tomcat-redis-session-manager以及基于Jetty的jetty-session-redis等等;
另一种就是容器解耦的,就是今天要集成的Spring-Session。
Springboot+redis 实现session共享也是利用了cookie在域名,路径相同的情况下可以共享内容。第一次请求会将SESSION保存在redis中,
并将SESSIONID返回到浏览器的cookie中,第二次请求会携带上第一次请求的JSESSIONID。服务端拿到ID先到redis中查找是否存在此SSSSION,存在则拿出来用,不会再创建新的会话。
Spring Session provides an API and implementations for managing a user’s session information.
1、引入依赖
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-data-redis</artifactId>
</dependency>
2、Session配置:
@Configuration
@EnableRedisHttpSession(maxInactiveIntervalInSeconds = 86400*30)
public class SessionConfig {
}
maxInactiveIntervalInSeconds: 设置Session失效时间,使用Redis Session之后,原Boot的server.session.timeout属性不再生效
好了,这样就配置好了,我们来测试一下
3、测试
添加测试方法获取sessionid
@RequestMapping("/uid")
String uid(HttpSession session) {
UUID uid = (UUID) session.getAttribute("uid");
if (uid == null) {
uid = UUID.randomUUID();
}
session.setAttribute("uid", uid);
return session.getId();
}
访问该接口后,然后登录redis 输入 keys ‘sessions’
spring:session:sessions:expires:930f9a6e-fd04-47b0-adf6-3c3cdc2ececd
spring:session:sessions:930f9a6e-fd04-47b0-adf6-3c3cdc2ececd
spring:session:expirations:1530020040000
其中 1530020040000 为失效时间,意思是这个时间后session失效,930f9a6e-fd04-47b0-adf6-3c3cdc2ececd,
登录http://localhost:8080/uid 发现会一致,就说明session 已经在redis里面进行有效的管理了。
127.0.0.1:6379> hkeys spring:session:sessions:d1b1cc0c-519e-431a-973c-6c742a014660
1) "sessionAttr:uid"
2) "lastAccessedTime"
3) "maxInactiveInterval"
4) "creationTime"
127.0.0.1:6379> hget spring:session:sessions:d1b1cc0c-519e-431a-973c-6c742a014660 sessionAttr:uid
"\xac\xed\x00\x05sr\x00\x0ejava.util.UUID\xbc\x99\x03\xf7\x98m\x85/\x02\x00\x02J\x00\x0cleastSigBitsJ\x00\x0bmostSigBitsxp\xa0E\xe3\x1d\xf9K\xecW6\xcf\xbc\xfbU\x13M\x88"
127.0.0.1:6379> hget spring:session:sessions:d1b1cc0c-519e-431a-973c-6c742a014660 lastAccessedTime
"\xac\xed\x00\x05sr\x00\x0ejava.lang.Long;\x8b\xe4\x90\xcc\x8f#\xdf\x02\x00\x01J\x00\x05valuexr\x00\x10java.lang.Number\x86\xac\x95\x1d\x0b\x94\xe0\x8b\x02\x00\x00xp\x00\x00\x01Rs\x8d\x12b"
如何在两台或者多台中共享session
其实就是按照上面的步骤在另一个项目中再次配置一次,启动后自动就进行了session共享。
作者:纯洁的微笑
版权所有,欢迎保留原文链接进行转载:)