共享Session-spring-session-data-redis

对于分布式的应用来说,用户的会话管理通常有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官方说明

Spring Session provides an API and implementations for managing a user’s session information.

如何使用

1、引入依赖

<dependency>
    <groupId>org.springframework.sessiongroupId>
    <artifactId>spring-session-data-redisartifactId>
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里面进行有效的管理了。

看看session对象

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共享。

作者:纯洁的微笑

出处:www.ityouknow.com

版权所有,欢迎保留原文链接进行转载:)

你可能感兴趣的:(spring,boot)