Redis集成Session
pom.xml
xml
<!-- Spring Boot Starter Data Redis -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!-- Spring Session Data Redis -->
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-data-redis</artifactId>
</dependency>SessionConfig.java
java
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.RedisSerializer;
import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession;
@Configuration
@EnableRedisHttpSession(maxInactiveIntervalInSeconds = 7200)
public class SessionConfig {
@Bean
public RedisSerializer<Object> springSessionDefaultRedisSerializer() {
return new Jackson2JsonRedisSerializer<>(Object.class);
}
}配置项
最大无活跃间隔(maxInactiveIntervalInSeconds)
这个属性用来设置Session的超时时间,即用户会话在多久没有活动之后应该被销毁
java
@Bean
public RedisSessionProperties redisSessionProperties() {
RedisSessionProperties redisSessionProperties = new RedisSessionProperties();
redisSessionProperties.setMaxInactiveIntervalInSeconds(1800); // 设置超时时间为30分钟
return redisSessionProperties;
}Session序列化方式(redisSerializer)
默认情况下,Spring Session使用
JdkSerializationRedisSerializer进行序列化,但是可以更改为其他序列化方式,如Jackson2JsonRedisSerializer或KryoRedisSerializer,以提高性能或可读性
java
@Bean
public RedisSerializer<Object> springSessionDefaultRedisSerializer() {
return new Jackson2JsonRedisSerializer<>(Object.class);
}Redis操作模板(redisTemplate)
如果需要对Redis操作进行更细粒度的控制,可以自定义
RedisTemplate
java
@Bean
public RedisTemplate<Object, Object> sessionRedisTemplate(RedisConnectionFactory connectionFactory) {
RedisTemplate<Object, Object> template = new RedisTemplate<>();
template.setConnectionFactory(connectionFactory);
// 设置序列化器等
return template;
}Session存储的键前缀(redisNamespace)
如果希望为存储在Redis中的Session键设置一个特定的命名空间,可以通过这种方式来实现
java
@EnableRedisHttpSession(redisNamespace = "your-namespace") // 设置命令时间清理会话的策略(cleanupCron)
默认情况下,Spring Session本身并不直接负责清理过期的会话。它依赖于底层存储(例如Redis、JDBC等)来管理会话的生命周期
java
@EnableRedisHttpSession(maxInactiveIntervalInSeconds = 7200) // 设置会话过期时间会话监听器(sessionListeners)
如果需要在会话创建或销毁时执行特定的逻辑,可以实现
SessionListener接口,并将其注册到配置中
java
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
public class YourSessionListener implements HttpSessionListener {
@Override
public void sessionCreated(HttpSessionEvent se) {
// 当会话被创建时调用
System.out.println("Session Created: " + se.getSession().getId());
}
@Override
public void sessionDestroyed(HttpSessionEvent se) {
// 当会话被销毁时调用
System.out.println("Session Destroyed: " + se.getSession().getId());
}
}java
@Bean
public ServletListenerRegistrationBean<SessionListener> sessionListener() {
ServletListenerRegistrationBean<SessionListener> listenerRegBean =
new ServletListenerRegistrationBean<>(new YourSessionListener());
listenerRegBean.setOrder(1); // 设置顺序(可选)
return listenerRegBean;
}示例代码
RedisSessionController.java
java
import javax.servlet.http.HttpSession;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class RedisSessionController {
@GetMapping("/setSession")
public String setSession(HttpSession session) {
session.setAttribute("user", "exampleUser");
return "Session attribute set";
}
@GetMapping("/getSession")
public String getSession(HttpSession session) {
return "User in session: " + session.getAttribute("user");
}
}访问网站:http://localhost:8080/setSession

查看缓存:

访问网站:http://localhost:8080/getSession

