一. 引入 jar 包
- <parent>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-parent</artifactId>
- <version>2.0.0.RELEASE</version>
- <relativePath/> <!-- lookup parent from repository -->
- </parent>
- <dependency>
- <groupId>org.springframework.session</groupId>
- <artifactId>spring-session-data-redis</artifactId>
- <version>2.0.2.RELEASE</version>
- </dependency>
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-data-redis</artifactId>
- </dependency>
二. 编写代码
1. 自定义序列化接口 , 实现 RedisSerializer 接口
- import com.alibaba.fastjson.JSON;
- import com.alibaba.fastjson.serializer.SerializerFeature;
- import org.springframework.data.redis.serializer.RedisSerializer;
- import org.springframework.data.redis.serializer.SerializationException;
- import java.nio.charset.Charset;
- /**
- * 说明: 自定义 redis 序列化方式
- *
- * @author WangBin
- * @version V1.0
- * @since 2018.03.22
- */
- public class FastJsonRedisSerializer<T> implements RedisSerializer<T> {
- public static final Charset DEFAULT_CHARSET = Charset.forName("UTF-8");
- private Class<T> clazz;
- public FastJsonRedisSerializer(Class<T> clazz) {
- super();
- this.clazz = clazz;
- }
- @Override
- public byte[] serialize(T t) throws SerializationException {
- if (t == null) {
- return new byte[0];
- }
- return JSON.toJSONString(t, SerializerFeature.WriteClassName).getBytes(DEFAULT_CHARSET);
- }
- @Override
- public T deserialize(byte[] bytes) throws SerializationException {
- if (bytes == null || bytes.length <= 0) {
- return null;
- }
- String str = new String(bytes, DEFAULT_CHARSET);
- return JSON.parseObject(str, clazz);
- }
- }
2.redis 配置
- import org.springframework.cache.annotation.CachingConfigurerSupport;
- import org.springframework.cache.annotation.EnableCaching;
- import org.springframework.cache.interceptor.KeyGenerator;
- import org.springframework.context.annotation.Bean;
- import org.springframework.context.annotation.Configuration;
- import org.springframework.data.redis.cache.RedisCacheConfiguration;
- import org.springframework.data.redis.connection.RedisConnectionFactory;
- import org.springframework.data.redis.core.RedisTemplate;
- import org.springframework.data.redis.serializer.RedisSerializationContext;
- import org.springframework.data.redis.serializer.StringRedisSerializer;
- import org.springframework.session.SessionRepository;
- import org.springframework.session.data.redis.RedisOperationsSessionRepository;
- import java.time.Duration;
- /**
- * redis 配置
- *
- * @author WangBin
- * @version V1.0
- * @date 2017.12.05
- */
- @Configuration
- @EnableCaching
- public class RedisConfig extends CachingConfigurerSupport {
- @Bean
- @Override
- public KeyGenerator keyGenerator() {
- return (target, method, params) -> {
- StringBuilder sb = new StringBuilder();
- sb.append(target.getClass().getName());
- sb.append(method.getName());
- for (Object obj : params) {
- sb.append(obj.toString());
- }
- return sb.toString();
- };
- }
- /**
- * 设置 redisTemplate 序列化方式
- * @param factory
- * @return
- */
- @Bean
- public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory factory) {
- RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>();
- redisTemplate.setConnectionFactory(factory);
- // 设置值 (value) 的序列化采用 FastJsonRedisSerializer
- FastJsonRedisSerializer<Object> fastJsonRedisSerializer = new FastJsonRedisSerializer<>(Object.class);
- redisTemplate.setValueSerializer(fastJsonRedisSerializer);
- redisTemplate.setHashValueSerializer(fastJsonRedisSerializer);
- // 设置键 (key) 的序列化采用 StringRedisSerializer
- redisTemplate.setKeySerializer(new StringRedisSerializer());
- redisTemplate.setHashKeySerializer(new StringRedisSerializer());
- redisTemplate.setDefaultSerializer(fastJsonRedisSerializer);
- redisTemplate.afterPropertiesSet();
- return redisTemplate;
- }
- /**
- * 设置 spring session redis 序列化方式
- * @param factory
- * @return
- */
- @Bean
- public SessionRepository sessionRepository(RedisConnectionFactory factory){
- RedisOperationsSessionRepository sessionRepository = new RedisOperationsSessionRepository(redisTemplate(factory));
- FastJsonRedisSerializer<Object> fastJsonRedisSerializer = new FastJsonRedisSerializer<>(Object.class);
- sessionRepository.setDefaultSerializer(fastJsonRedisSerializer);
- sessionRepository.setDefaultMaxInactiveInterval(36000);
- return sessionRepository;
- }
- }
3.HttpSession 配置
- import org.springframework.beans.factory.annotation.Value;
- import org.springframework.context.annotation.Bean;
- import org.springframework.context.annotation.Configuration;
- import org.springframework.data.redis.connection.RedisPassword;
- import org.springframework.data.redis.connection.RedisStandaloneConfiguration;
- import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
- import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession;
- import org.springframework.session.web.http.HeaderHttpSessionIdResolver;
- import org.springframework.session.web.http.HttpSessionIdResolver;
- /**
- * 说明: 自定义 session
- *
- * @author WangBin
- * @version v1.0
- * @date 2018/1/27/027.
- */
- @Configuration
- @EnableRedisHttpSession(maxInactiveIntervalInSeconds = 36000)
- public class HttpSessionConfig {
- @Value("${spring.redis.host}")
- private String host;
- @Value("${spring.redis.port}")
- private int port;
- @Value("${spring.redis.password}")
- private String password;
- /**
- * RedisHttpSession 创建 连接工厂
- *
- * @return LettuceConnectionFactory
- */
- @Bean
- public LettuceConnectionFactory connectionFactory() {
- RedisStandaloneConfiguration config = new RedisStandaloneConfiguration();
- config.setHostName(host);
- config.setPort(port);
- config.setPassword(RedisPassword.of(password));
- return new LettuceConnectionFactory(config);
- }
三. 遗留问题
devtools 热加载后 从 redis 读取 session 里的 属性的时候 转换为对象 会报 java.lang.ClassCastException
debug 发现 热加载后 序列化方式一致, 但会报该异常
正常运行 或 重启项目 无该问题
来源: https://blog.csdn.net/b376924098/article/details/79701631