Java: jdk1.8.0_144
Spring Boot: 2.0.1.RELEASEhtml
本文前提是已使用Spring Boot搭建了一個Web應用,在此基礎上集成Spring Session以使用Redis管理該應用的sessionhtml5
<dependency> <groupId>org.springframework.session</groupId> <artifactId>spring-session-data-redis</artifactId> </dependency> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> </dependency>
spring.session.store-type=redis
配置該屬性後,應用啓動時將建立名爲springSessionRepositoryFilter
的過濾器,它負責在後臺把javax.servlet.http.HttpSession
的實現替換爲Spring Session,更多的配置示例java
spring.session.redis.flush-mode=on-save spring.session.redis.namespace=spring:session server.servlet.session.timeout=1800
spring.redis.host=127.0.0.1 spring.redis.password=123456 spring.redis.port=6379
應用將自動建立RedisConnectionFactory
並鏈接目標Redis Serverweb
對象結構存入javax.servlet.http.HttpSession
,最終須要以字節或者字符的形式存入Redis,故能夠指定序列化與反序列方法(例如org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer
),若未指定則使用JDK自帶的java.io.Serializable
,如下面的類爲例說明執行httpSession.setAttribute("verify", verify)
在使用不一樣序列化方法時的表現redis
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
接口,不然拋出異常spring
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中的結構示例:session
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) "\xac\xed\x00\x05sr\x00\x11java.lang.Integer\x12\xe2\xa0\xa4\xf7\x81\x878\x02\x00\x01I\x00\x05valuexr\x00\x10java.lang.Number\x86\xac\x95\x1d\x0b\x94\xe0\x8b\x02\x00\x00xp\x00\x00\a\b" 3) "sessionAttr:verify" 4) "\xac\xed\x00\x05sr\x00 org.lxp.dailylog.web.util.Verify\x00\x00\x00\x00\x00\x00\x00\x01\x02\x00\x02L\x00\x04codet\x00\x12Ljava/lang/String;L\x00\x05valuet\x00\x13Ljava/lang/Integer;xpt\x00\a1 + 5=?sr\x00\x11java.lang.Integer\x12\xe2\xa0\xa4\xf7\x81\x878\x02\x00\x01I\x00\x05valuexr\x00\x10java.lang.Number\x86\xac\x95\x1d\x0b\x94\xe0\x8b\x02\x00\x00xp\x00\x00\x00\x06" 5) "creationTime" 6) "\xac\xed\x00\x05sr\x00\x0ejava.lang.Long;\x8b\xe4\x90\xcc\x8f#\xdf\x02\x00\x01J\x00\x05valuexr\x00\x10java.lang.Number\x86\xac\x95\x1d\x0b\x94\xe0\x8b\x02\x00\x00xp\x00\x00\x01d\x1cZSC" 7) "lastAccessedTime" 8) "\xac\xed\x00\x05sr\x00\x0ejava.lang.Long;\x8b\xe4\x90\xcc\x8f#\xdf\x02\x00\x01J\x00\x05valuexr\x00\x10java.lang.Number\x86\xac\x95\x1d\x0b\x94\xe0\x8b\x02\x00\x00xp\x00\x00\x01d\x1cZSC" 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中的結構示例:ide
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"