1、配置Config
@EnableRedisHttpSession
public class SessionConfig{
@Bean
public LettuceConnectionFactory connectionFactory(){
return new LettuceConnectionFactory();
}
}
@EnableRedisHttpSession注解的作用:
1)创建了一个Spring Bean
2)springSessionRepositoryFilter过滤器替换HttpSession的Spring Session支持的实现,该由redis支持
LettuceConnectionFactory的作用:
创建一个RedisConnectionFactory,作用是Spring Session连接到redis服务器的对象
如果是对接springboot,就不需要写LettuceConnectionFactory
@EnableRedisHttpSession
public class HttpSessionConfig{
}
2、servlet容器初始化
public class Initializer extends AbstractHttpSessionApplicationInitializer{
public Initializer(){
super(SessionConfig.class);
}
}
1)继承AbstractHttpSessionApplicationInitializer
这一步保证了springSessionRepositoryFilter里的bean都能被注册到servlet容器中,保证了对所有的请求request都有效
也就是保证config配置类上的@EnableRedisHttpSession注解有效
2)AbstractHttpSessionApplicationInitializer也支持把我们自己的config配置加入到容器中
super(xxx)
如果是对接springboot,则不需要容器初始化这2步,springboot自动完成了这2个步骤
3、httpsession并没有使用到tomcat
HttpSession并没有使用到tomcat,而是将值存到cookie中作为sessionID(会话id)
4、SessionRepository
一般不会直接原生使用SessionRepository和Session,而是通过HttpSession和WebSocket
也可以通过实现FindByIndexNameSessionRepository,redis就实现了该repository
public class RedisIndexedSessionRepository
implements FindByIndexNameSessionRepository<RedisIndexedSessionRepository.RedisSession>, MessageListener {}
5、redis的session实现不支持开箱即用的session过期策略
redis的过期键删除策略是:过期键在下一次被访问到时删除+定期删除
所以当要清除session时,需要自己清除过期的session
6、配置session的timeout的顺序
1)RedisIndexedSessionRepository的setDefaultMaxInactiveInterval()方法配置过期时间
2)application.yml的spring.session.timeout配置过期时间
3)server.servlet.session.timeout配置过期时间
注意:
1 > 2 > 3!!
7、Redis对过期时间的监听
1)redis解除对config命令的禁用
redis-cli config set notify-keyspace-events Egx
2)Java解除对config命令的禁用
@Bean
public static ConfigureRedisAction configureRedisAction(){
return ConfigureRedisAction.NO_OP;
}
3)配置redis监听事件
@Configuration
public class RedisConfiguration{
@Autowired
RedisConnectionFactory redisConnectionFactory;
@Bean
public RedisMessageListenerContainer redisMessageListenerContainer(){
RedisMessageListenerContainer redisMessageListenerContainer = new RedisMessageListenerContainer();
redisMessageListenerContainer.setConnectionFactory(redisConnectionFactory);
return redisMessageListenerContainer;
}
@Bean
public KeyExpirationEventMessageListener keyExpirationEventMessageListener(){
return new KeyExpirationEventMessageListener(this.redisMessageListenerContainer());
}
}
4)redis的key过期监听
@Componet
public class KeyExpiredListener extends KeyExpirationEventMessageListener{
public KeyExpiredListner(RedisMessageListenerContainer listenerContainer){
super(ListenerContainer);
}
@Override
public void onMessage(Message message, byte[] pattern){
String channel = new String(message.getChannel(), StandardCharsets.UTF_8);
//过期的key
String key = new String(message.getBody(), StandardCharsets.UTF_8);
}
}
本文详细介绍了如何利用Spring Session结合Redis来管理HttpSession。从配置Config到servlet容器初始化,再到RedisSessionRepository的使用,以及解决Redis不支持默认session过期策略的问题,最后讨论了Redis对过期时间的监听设置。通过这些步骤,可以实现高效且可靠的session存储和管理。

950

被折叠的 条评论
为什么被折叠?



