RedisTokenStore Token序列化和反序列化
时间: 2023-07-18 17:24:07 浏览: 65
RedisTokenStore 默认使用 JDK 序列化方式来序列化和反序列化 Token,但是 JDK 序列化方式有一些缺点,比如序列化后的字节数组长度大、序列化速度慢、可读性差等。为了解决这些问题,可以使用其他序列化方式,比如 JSON 序列化方式。
在 RedisTokenStore 中,Token 的序列化和反序列化过程分别通过 `serializeAccessToken` 和 `deserializeAccessToken`、`serializeRefreshToken` 和 `deserializeRefreshToken` 方法实现。默认情况下,这些方法使用了 JDK 序列化方式,代码如下:
```
private byte[] serializeAccessToken(OAuth2AccessToken token) {
return SerializationUtils.serialize(token);
}
private byte[] serializeRefreshToken(OAuth2RefreshToken token) {
return SerializationUtils.serialize(token);
}
private OAuth2AccessToken deserializeAccessToken(byte[] bytes) {
return SerializationUtils.deserialize(bytes);
}
private OAuth2RefreshToken deserializeRefreshToken(byte[] bytes) {
return SerializationUtils.deserialize(bytes);
}
```
如果要使用其他的序列化方式,可以自定义这些方法,并在构造函数中指定序列化方式,例如使用 JSON 序列化方式:
```
public class RedisTokenStore implements TokenStore {
private final RedisTemplate<String, Object> redisTemplate;
private final ObjectMapper objectMapper;
public RedisTokenStore(RedisConnectionFactory connectionFactory) {
Assert.notNull(connectionFactory, "connectionFactory cannot be null");
this.redisTemplate = new RedisTemplate<>();
this.redisTemplate.setConnectionFactory(connectionFactory);
this.redisTemplate.setKeySerializer(new StringRedisSerializer());
this.redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
this.redisTemplate.setHashKeySerializer(new StringRedisSerializer());
this.redisTemplate.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());
this.redisTemplate.afterPropertiesSet();
this.objectMapper = new ObjectMapper()
.registerModule(new OAuth2Module())
.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)
.setPropertyNamingStrategy(PropertyNamingStrategy.SNAKE_CASE);
}
private byte[] serializeAccessToken(OAuth2AccessToken token) {
try {
return objectMapper.writeValueAsBytes(token);
} catch (JsonProcessingException e) {
throw new RuntimeException("Failed to serialize access token", e);
}
}
private byte[] serializeRefreshToken(OAuth2RefreshToken token) {
try {
return objectMapper.writeValueAsBytes(token);
} catch (JsonProcessingException e) {
throw new RuntimeException("Failed to serialize refresh token", e);
}
}
private OAuth2AccessToken deserializeAccessToken(byte[] bytes) {
try {
return objectMapper.readValue(bytes, DefaultOAuth2AccessToken.class);
} catch (IOException e) {
throw new RuntimeException("Failed to deserialize access token", e);
}
}
private OAuth2RefreshToken deserializeRefreshToken(byte[] bytes) {
try {
return objectMapper.readValue(bytes, DefaultOAuth2RefreshToken.class);
} catch (IOException e) {
throw new RuntimeException("Failed to deserialize refresh token", e);
}
}
// ...
}
```
这里使用了 Jackson 库来进行 JSON 序列化和反序列化,并且注册了一个 OAuth2Module,以支持 OAuth2AccessToken 和 OAuth2RefreshToken 的序列化和反序列化。