基本使用
springRedisSession常用于解决多机部署的session统一问题,将session存入redis。以实现session的多机共识性。
Springboot redisSession需要加上
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!--Redis Session-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-session-data-redis</artifactId>
</dependency>
然后在启动类上加入@EnableRedisHttpSession
@SpringBootApplication
@EnableRedisHttpSession
public class PaymentApplication {
public static void main(String[] args) {
SpringApplication springApplication = new SpringApplication(PaymentApplication.class);
springApplication.run(args);
}
}
Spring HttpRedis的原理
SpringHttp实际上就是做了ServletFilter,Filter的类名为 org.springframework.session.web.http.SessionRepositoryFilter
Spring怎么寻Filter类的
我们通常Filter要实现Filter类,然后注入生成bean注入到Spring中,Spring 通过
Sevlet的Filter
Tomcat是通过
org.apache.coyote.http11.Http11Processor#service
这个方法来创建request和response类的.
如何删除session
request.getSession().invalidate();
如何设置Session的超时时间
session的默认时间为: DEFAULT_MAX_INACTIVE_INTERVAL_SECONDS = 1800;等于30分钟。
在使用RedisIndexedSessionRepository的情况下,直接用注解 @EnableRedisHttpSession(maxInactiveIntervalInSeconds = 60)
RedisSession中Redis的三个键值对存了些什么
就一个sesion而言,redis存了3个key
spring:session:sessions:b82b4153-ddb7-494c-b7fe-a28ae4f5db61
spring:session:sessions:expires:b2bfe5a3-698b-4a8d-a93f-4c0e584b92d6
spring:session:expirations:1656052140000
设置的方法为 org.springframework.session.data.redis.RedisIndexedSessionRepository.RedisSession#saveDelta
第一个key,主要存session中的一些键值对,以及创建时间,上一次请求时间,这个key的存活时间为5分钟+最大超时时间
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yzVm9fEx-1656056826363)(C:\Users\jm011254\AppData\Roaming\Typora\typora-user-images\image-20220624142828566.png)]
第二个key,主要是存真正的超时时间,设置的60秒 就会只有60秒
this.redis.boundValueOps(sessionKey).append("");
this.redis.boundValueOps(sessionKey).expire(sessionExpireInSeconds, TimeUnit.SECONDS);
存这个的目的是为了更好查询到第三个key。
第三个key, 主要是设置key的超时时间,超时时间会在设置的基础上加5分钟‘
long fiveMinutesAfterExpires = sessionExpireInSeconds + TimeUnit.MINUTES.toSeconds(5);
expireOperations.expire(fiveMinutesAfterExpires, TimeUnit.SECONDS);
存这个的目的是为了定时由org.springframework.session.data.redis.RedisSessionExpirationPolicy#cleanExpiredSessions
清理.(需要开启定时任务)。
更改Redis的序列化方式
只需要指定redis的序列化就行了
@Bean(name = "springSessionDefaultRedisSerializer")
public RedisSerializer getRedisSerializer() {
return new FastJsonRedisSerializer(Object.class);
}
自定义NameSpace
只需要注解的时候,修改成为
@EnableRedisHttpSession(maxInactiveIntervalInSeconds = 60,redisNamespace = "session")
修改sessionRepository
通过创建SessionRepositoryCustomizer 来自定义sessionRepository
@Bean
public SessionRepositoryCustomizer getsessionRepositoryCustomizer(){
return new SessionRepositoryCustomizer() {
@Override
public void customize(SessionRepository sessionRepository) {
RedisIndexedSessionRepository sessionRepository1 = (RedisIndexedSessionRepository) sessionRepository;
sessionRepository1.setFlushMode(FlushMode.IMMEDIATE);
sessionRepository1.setDatabase(2);
}
};
}
3. 修改 spring-session 存储配置
spring:
session:
timeout: 86400
store-type: redis
# 默认是 none,表示存储在服务器
# redis 表示从 redis 去写 session
配置完成之后,就可以将登录之后的用户信息存储到 redis 中。
另外:
怎么将用户信息在 session 中存入 / 读取。
// 存储用户信息到 session
request.getSession().setAttribute("user", user);
// 在 session 中读取用户信息
request.getSession().getAttribute("user");
// "user":用户信息存储到 session 中的 key
// user:用户信息