From 8c34b8e868508c0dfc832567bd645b3dfdecf2e3 Mon Sep 17 00:00:00 2001 From: zlt2000 Date: Wed, 30 Sep 2020 17:01:19 +0800 Subject: [PATCH] =?UTF-8?q?fix=20#I1X2U5=20redis=E7=9A=84increment?= =?UTF-8?q?=E5=91=BD=E4=BB=A4=E7=9A=84=E5=8F=8D=E5=BA=8F=E5=88=97=E5=8C=96?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/store/AuthRedisTokenStore.java | 4 +- .../common/store/CustomRedisTokenStore.java | 11 +++- .../common/redis/RedisAutoConfigure.java | 2 +- .../redis/template/RedisRepository.java | 52 +++++++++++++++++++ .../service/impl/RedisTokensServiceImpl.java | 7 ++- 5 files changed, 69 insertions(+), 7 deletions(-) diff --git a/zlt-commons/zlt-auth-client-spring-boot-starter/src/main/java/com/central/oauth2/common/store/AuthRedisTokenStore.java b/zlt-commons/zlt-auth-client-spring-boot-starter/src/main/java/com/central/oauth2/common/store/AuthRedisTokenStore.java index ec4f311..8d5094c 100644 --- a/zlt-commons/zlt-auth-client-spring-boot-starter/src/main/java/com/central/oauth2/common/store/AuthRedisTokenStore.java +++ b/zlt-commons/zlt-auth-client-spring-boot-starter/src/main/java/com/central/oauth2/common/store/AuthRedisTokenStore.java @@ -21,7 +21,7 @@ import org.springframework.security.oauth2.provider.token.TokenStore; @ConditionalOnProperty(prefix = "zlt.oauth2.token.store", name = "type", havingValue = "redis", matchIfMissing = true) public class AuthRedisTokenStore { @Bean - public TokenStore tokenStore(RedisConnectionFactory connectionFactory, SecurityProperties securityProperties) { - return new CustomRedisTokenStore(connectionFactory, securityProperties); + public TokenStore tokenStore(RedisConnectionFactory connectionFactory, SecurityProperties securityProperties, RedisSerializer redisValueSerializer) { + return new CustomRedisTokenStore(connectionFactory, securityProperties, redisValueSerializer); } } diff --git a/zlt-commons/zlt-auth-client-spring-boot-starter/src/main/java/com/central/oauth2/common/store/CustomRedisTokenStore.java b/zlt-commons/zlt-auth-client-spring-boot-starter/src/main/java/com/central/oauth2/common/store/CustomRedisTokenStore.java index ec1eba1..ad35a6f 100644 --- a/zlt-commons/zlt-auth-client-spring-boot-starter/src/main/java/com/central/oauth2/common/store/CustomRedisTokenStore.java +++ b/zlt-commons/zlt-auth-client-spring-boot-starter/src/main/java/com/central/oauth2/common/store/CustomRedisTokenStore.java @@ -4,6 +4,7 @@ import com.central.common.constant.SecurityConstants; import com.central.oauth2.common.properties.SecurityProperties; import org.springframework.data.redis.connection.RedisConnection; import org.springframework.data.redis.connection.RedisConnectionFactory; +import org.springframework.data.redis.serializer.RedisSerializer; import org.springframework.security.oauth2.common.DefaultOAuth2AccessToken; import org.springframework.security.oauth2.common.ExpiringOAuth2RefreshToken; import org.springframework.security.oauth2.common.OAuth2AccessToken; @@ -61,9 +62,15 @@ public class CustomRedisTokenStore implements TokenStore { */ private SecurityProperties securityProperties; - public CustomRedisTokenStore(RedisConnectionFactory connectionFactory, SecurityProperties securityProperties) { + /** + * 业务redis的value序列化 + */ + private RedisSerializer redisValueSerializer; + + public CustomRedisTokenStore(RedisConnectionFactory connectionFactory, SecurityProperties securityProperties, RedisSerializer redisValueSerializer) { this.connectionFactory = connectionFactory; this.securityProperties = securityProperties; + this.redisValueSerializer = redisValueSerializer; if (springDataRedis_2_0) { this.loadRedisConnectionMethods_2_0(); } @@ -111,7 +118,7 @@ public class CustomRedisTokenStore implements TokenStore { } private ClientDetails deserializeClientDetails(byte[] bytes) { - return serializationStrategy.deserialize(bytes, ClientDetails.class); + return (ClientDetails)redisValueSerializer.deserialize(bytes); } private byte[] serialize(String string) { diff --git a/zlt-commons/zlt-redis-spring-boot-starter/src/main/java/com/central/common/redis/RedisAutoConfigure.java b/zlt-commons/zlt-redis-spring-boot-starter/src/main/java/com/central/common/redis/RedisAutoConfigure.java index 33b755f..6f25cec 100644 --- a/zlt-commons/zlt-redis-spring-boot-starter/src/main/java/com/central/common/redis/RedisAutoConfigure.java +++ b/zlt-commons/zlt-redis-spring-boot-starter/src/main/java/com/central/common/redis/RedisAutoConfigure.java @@ -41,7 +41,7 @@ public class RedisAutoConfigure { @Bean public RedisSerializer redisValueSerializer() { - return RedisSerializer.java(); + return RedisSerializer.json(); } /** diff --git a/zlt-commons/zlt-redis-spring-boot-starter/src/main/java/com/central/common/redis/template/RedisRepository.java b/zlt-commons/zlt-redis-spring-boot-starter/src/main/java/com/central/common/redis/template/RedisRepository.java index 3770878..d083ece 100644 --- a/zlt-commons/zlt-redis-spring-boot-starter/src/main/java/com/central/common/redis/template/RedisRepository.java +++ b/zlt-commons/zlt-redis-spring-boot-starter/src/main/java/com/central/common/redis/template/RedisRepository.java @@ -8,6 +8,9 @@ import org.springframework.data.redis.core.HashOperations; import org.springframework.data.redis.core.ListOperations; import org.springframework.data.redis.core.RedisCallback; import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.data.redis.serializer.RedisSerializer; +import org.springframework.data.redis.serializer.SerializationUtils; +import org.springframework.util.Assert; import java.util.*; import java.util.concurrent.TimeUnit; @@ -146,6 +149,17 @@ public class RedisRepository { public Object get(final String key) { return redisTemplate.opsForValue().get(key); } + /** + * 根据key获取对象 + * + * @param key the key + * @param valueSerializer 序列化 + * @return the string + */ + public Object get(final String key, RedisSerializer valueSerializer) { + byte[] rawKey = rawKey(key); + return redisTemplate.execute(connection -> deserializeValue(connection.get(rawKey), valueSerializer), true); + } /** * Ops for hash hash operations. @@ -361,6 +375,20 @@ public class RedisRepository { return opsForList().range(key, start, end); } + /** + * redis List数据结构 : 返回列表 key 中指定区间内的元素,区间以偏移量 start 和 end 指定。 + * + * @param key the key + * @param start the start + * @param end the end + * @param valueSerializer 序列化 + * @return the list + */ + public List getList(String key, int start, int end, RedisSerializer valueSerializer) { + byte[] rawKey = rawKey(key); + return redisTemplate.execute(connection -> deserializeValues(connection.lRange(rawKey, start, end), valueSerializer), true); + } + /** * redis List数据结构 : 批量存储 * @@ -382,4 +410,28 @@ public class RedisRepository { public void insert(String key, long index, Object value) { opsForList().set(key, index, value); } + + private byte[] rawKey(Object key) { + Assert.notNull(key, "non null key required"); + + if (key instanceof byte[]) { + return (byte[]) key; + } + RedisSerializer redisSerializer = (RedisSerializer)redisTemplate.getKeySerializer(); + return redisSerializer.serialize(key); + } + + private List deserializeValues(List rawValues, RedisSerializer valueSerializer) { + if (valueSerializer == null) { + return rawValues; + } + return SerializationUtils.deserialize(rawValues, valueSerializer); + } + + private Object deserializeValue(byte[] value, RedisSerializer valueSerializer) { + if (valueSerializer == null) { + return value; + } + return valueSerializer.deserialize(value); + } } diff --git a/zlt-uaa/src/main/java/com/central/oauth/service/impl/RedisTokensServiceImpl.java b/zlt-uaa/src/main/java/com/central/oauth/service/impl/RedisTokensServiceImpl.java index 8a6c81b..9aa9542 100644 --- a/zlt-uaa/src/main/java/com/central/oauth/service/impl/RedisTokensServiceImpl.java +++ b/zlt-uaa/src/main/java/com/central/oauth/service/impl/RedisTokensServiceImpl.java @@ -10,6 +10,7 @@ import com.central.oauth.service.ITokensService; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.MapUtils; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.serializer.RedisSerializer; import org.springframework.security.oauth2.common.DefaultOAuth2AccessToken; import org.springframework.security.oauth2.provider.OAuth2Authentication; import org.springframework.security.oauth2.provider.OAuth2Request; @@ -40,8 +41,10 @@ public class RedisTokensServiceImpl implements ITokensService { String redisKey = getRedisKey(params, clientId); long size = redisRepository.length(redisKey); List result = new ArrayList<>(limit); + RedisSerializer valueSerializer = RedisSerializer.java(); //查询token集合 - List tokenObjs = redisRepository.getList(redisKey, startEnds[0], startEnds[1]-1); + //redisRepository.getRedisTemplate().e + List tokenObjs = redisRepository.getList(redisKey, startEnds[0], startEnds[1]-1, valueSerializer); if (tokenObjs != null) { for (Object obj : tokenObjs) { DefaultOAuth2AccessToken accessToken = (DefaultOAuth2AccessToken)obj; @@ -51,7 +54,7 @@ public class RedisTokensServiceImpl implements ITokensService { tokenVo.setExpiration(accessToken.getExpiration()); //获取用户信息 - Object authObj = redisRepository.get(SecurityConstants.REDIS_TOKEN_AUTH + accessToken.getValue()); + Object authObj = redisRepository.get(SecurityConstants.REDIS_TOKEN_AUTH + accessToken.getValue(), valueSerializer); OAuth2Authentication authentication = (OAuth2Authentication)authObj; if (authentication != null) { OAuth2Request request = authentication.getOAuth2Request(); -- GitLab