springboot使用redis做缓存密码信息需要设置为JsonIgnore但是存入redis使用json序列化又需要密码信息怎么处理呢
可以考虑使用自定义序列化和反序列化来解决这个问题。
- 自定义序列化器:在序列化对象时,判断对象是否有密码信息,如果有,则将密码信息存入一个临时变量中,并将密码信息设为空,然后再进行序列化。代码示例:
public class UserSerializer extends JsonSerializer<User> {
@Override
public void serialize(User user, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
jsonGenerator.writeStartObject();
jsonGenerator.writeStringField("name", user.getName());
jsonGenerator.writeStringField("age", user.getAge());
if (StringUtils.isNotBlank(user.getPassword())) {
jsonGenerator.writeFieldName("password");
jsonGenerator.writeObject(user.getPassword());
}
jsonGenerator.writeEndObject();
}
}
- 自定义反序列化器:在反序列化对象时,判断是否有密码信息,如果有,则将临时变量中的密码信息重新设置到对象中。代码示例:
public class UserDeserializer extends JsonDeserializer<User> {
@Override
public User deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JsonProcessingException {
ObjectCodec codec = jsonParser.getCodec();
JsonNode node = codec.readTree(jsonParser);
String name = node.get("name").asText();
String age = node.get("age").asText();
String password = null;
if (node.has("password")) {
password = node.get("password").asText();
}
User user = new User(name, age, password);
return user;
}
}
在使用的时候,可以在对象的密码字段上加上@JsonIgnore注解,然后在Redis的配置中,指定自定义的序列化器和反序列化器。这样就可以在序列化和反序列化时,动态处理密码信息了
原文地址: https://www.cveoy.top/t/topic/e2JU 著作权归作者所有。请勿转载和采集!