官网:https://spring.io/projects/spring-session
方案
集群中共享session的方案:
一、无需共享:1、将会话信息放在cookie中;2、利用负载均衡,同一IP的请求总是转发到同一台Tomcat
二、Session同步:放开Tomcat的server.xml中的<Cluster>,Tomcat将在同一网段广播session变化
三、Session单独存储:1、将session存到数据库中;2、将Session存到缓存服务器,例如redis、memcached
方案三的工具有tomcat-redis-session-manager、memcached-session-manager、spring-session等
Spring Session项目组成
前提:已集成Spring-data-redis
1、配置Maven依赖
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-data-redis</artifactId>
<version>2.0.6.RELEASE</version>
</dependency>
2、项目web.xml
配置过滤器,web.xml中的配置得按一定顺序
<filter>
<filter-name>springSessionRepositoryFilter</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
<filter-name>springSessionRepositoryFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
3、Spring配置文件
<bean class="org.springframework.session.data.redis.config.annotation.web.http.RedisHttpSessionConfiguration"/>
4、使用
在Controller中传入HttpSession,即可读写session
SpringBoot 整合 Spring Session
1、SpringBoot 整合 Redis,参考 https://www.jianshu.com/p/01e2166dbb3c
2、pom.xml
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-data-redis</artifactId>
</dependency>
3-1、application.yml
spring:
session:
store-type: redis
timeout: 3600s
redis:
flush-mode: on_save # 响应完成后在将本机的session 同步 到 redis,immediate 则在 setAttribute和removeAttribute时同步
namespace: my # key的前缀
3-2、以上配置也可以通过注解实现(注解在主类),二选一即可
@EnableRedisHttpSession(maxInactiveIntervalInSeconds=1800, redisFlushMode=RedisFlushMode.ON_SAVE, redisNamespace = "my")
spring-session-data-redis 存储的key
"sessions:哈希值" :session的创建时间、最后访问时间、Attributes、有效时长,另外还有TTL
"session:index:org.springframework.session.FindByIndexNameSessionRepository.PRINCIPAL_NAME_INDEX_NAME:用户名":用于通过用户名来查找session
"sessions:expires:哈希值":空值,TTL 比 "sessions:哈希值" 小5分钟;用于标记session的真正的有效期
过期事件:"sessions:expires:哈希值"被删除,即表示session过期,此时redis发布”过期事件“;session过期后,"sessions:哈希值" 仍会保留5分钟,用于过期事件订阅者查询
网友评论