Skip to content

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进行序列化,但是可以更改为其他序列化方式,如Jackson2JsonRedisSerializerKryoRedisSerializer,以提高性能或可读性

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

image-20241029144850199

查看缓存:

image-20241029144923417

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

image-20241029145039140