zoukankan      html  css  js  c++  java
  • Spring Boot与Spring Session集成

    1. 参考资料

    2. 环境

    Java: jdk1.8.0_144
    Spring Boot: 2.0.1.RELEASE

    3. 配置

    本文前提是已使用Spring Boot搭建了一个Web应用,在此基础上集成Spring Session以使用Redis管理该应用的session

    • 引入依赖包
        <dependency>
          <groupId>org.springframework.session</groupId>
          <artifactId>spring-session-data-redis</artifactId>
        </dependency>
        <dependency>
          <groupId>redis.clients</groupId>
          <artifactId>jedis</artifactId>
        </dependency>
    
    • Spring Session配置
    spring.session.store-type=redis
    

    配置该属性后,应用启动时将创建名为springSessionRepositoryFilter的过滤器,它负责在后台把javax.servlet.http.HttpSession的实现替换为Spring Session,更多的配置示例

    spring.session.redis.flush-mode=on-save
    spring.session.redis.namespace=spring:session
    server.servlet.session.timeout=1800
    
    • Redis连接配置
    spring.redis.host=127.0.0.1
    spring.redis.password=123456
    spring.redis.port=6379
    

    应用将自动创建RedisConnectionFactory并连接目标Redis Server

    4. Redis存储结构

    对象结构存入javax.servlet.http.HttpSession,最终需要以字节或者字符的形式存入Redis,故可以指定序列化与反序列方法(例如org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer),若未指定则使用JDK自带的java.io.Serializable,以下面的类为例说明执行httpSession.setAttribute("verify", verify)在使用不同序列化方法时的表现

    public class Verify {
        private String code;// 如 1 + 2
        private Integer value;// 如 3
    
        public String getCode() {
            return code;
        }
    
        public void setCode(String code) {
            this.code = code;
        }
    
        public Integer getValue() {
            return value;
        }
    
        public void setValue(Integer value) {
            this.value = value;
        }
    }
    
    • java.io.Serializable

    此时Verify类必须实现java.io.Serializable接口,否则抛出异常

    Caused by: java.lang.IllegalArgumentException: DefaultSerializer requires a Serializable payload but received an object of type [org.*.Verify]
    	at org.springframework.core.serializer.DefaultSerializer.serialize(DefaultSerializer.java:43)
    	at org.springframework.core.serializer.support.SerializingConverter.convert(SerializingConverter.java:63)
    	... 37 common frames omitted
    

    Redis中的结构示例:

    127.0.0.1:6379> keys *
    1) "spring:session:sessions:d850410a-557d-4b01-b194-9af0c3336517"
    2) "spring:session:expirations:1529485860000"
    3) "spring:session:sessions:expires:d850410a-557d-4b01-b194-9af0c3336517"
    127.0.0.1:6379> HGETALL spring:session:sessions:d850410a-557d-4b01-b194-9af0c3336517
    1) "maxInactiveInterval"
    2) "xacxedx00x05srx00x11java.lang.Integerx12xe2xa0xa4xf7x81x878x02x00x01Ix00x05valuexrx00x10java.lang.Numberx86xacx95x1dx0bx94xe0x8bx02x00x00xpx00x00a"
    3) "sessionAttr:verify"
    4) "xacxedx00x05srx00 org.lxp.dailylog.web.util.Verifyx00x00x00x00x00x00x00x01x02x00x02Lx00x04codetx00x12Ljava/lang/String;Lx00x05valuetx00x13Ljava/lang/Integer;xptx00a1 + 5=?srx00x11java.lang.Integerx12xe2xa0xa4xf7x81x878x02x00x01Ix00x05valuexrx00x10java.lang.Numberx86xacx95x1dx0bx94xe0x8bx02x00x00xpx00x00x00x06"
    5) "creationTime"
    6) "xacxedx00x05srx00x0ejava.lang.Long;x8bxe4x90xccx8f#xdfx02x00x01Jx00x05valuexrx00x10java.lang.Numberx86xacx95x1dx0bx94xe0x8bx02x00x00xpx00x00x01dx1cZSC"
    7) "lastAccessedTime"
    8) "xacxedx00x05srx00x0ejava.lang.Long;x8bxe4x90xccx8f#xdfx02x00x01Jx00x05valuexrx00x10java.lang.Numberx86xacx95x1dx0bx94xe0x8bx02x00x00xpx00x00x01dx1cZSC"
    127.0.0.1:6379> 
    
    • org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer
    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;
    
    @Configuration
    public class JedisConfig {
        @Bean
        public RedisSerializer<Object> springSessionDefaultRedisSerializer() {
            return new Jackson2JsonRedisSerializer<>(Object.class);
        }
    }
    
    

    Redis中的结构示例:

    127.0.0.1:6379> keys *
    1) "spring:session:expirations:1529486220000"
    2) "spring:session:sessions:expires:8a804a79-862e-4e05-9fc0-e8db7cbf33f9"
    3) "spring:session:sessions:8a804a79-862e-4e05-9fc0-e8db7cbf33f9"
    127.0.0.1:6379> HGETALL spring:session:sessions:8a804a79-862e-4e05-9fc0-e8db7cbf33f9
    1) "lastAccessedTime"
    2) "1529484404321"
    3) "sessionAttr:verify"
    4) "{"code":"8 + 10=?","value":18}"
    5) "maxInactiveInterval"
    6) "1800"
    7) "creationTime"
    8) "1529484404321"
    
  • 相关阅读:
    LeetCode-434-字符串中的单词数
    LeetCode-415-字符串相加
    字符串
    序列
    元组
    列表
    repr()与str的区别
    输出函数print()
    输入函数input()
    MySQL中快速复制数据表方法汇总
  • 原文地址:https://www.cnblogs.com/hiver/p/9204845.html
Copyright © 2011-2022 走看看