定制序列化和反序列化方法
场景描述
由于HTTP协议的非安全性,在网络中传输的数据能轻易被各种抓包工具监听。在实际应用中,业务对应用或服务间传输的敏感数据有较高的安全要求,这类数据需要特别的加密保护(业务不同对算法要求不同),这样即使内容被截获,也可以保护其中的敏感数据不被轻易获取。
解决方法
服务间的通信离开不序列化和反序列化,对于上述的场景,使用jackson类库提供的 @JsonSerialize 和 @JsonDeserialize 注解功能,对敏感数据定制序列化和反序列化方法,并在定制化的方法中实现加解密功能。
注解描述参考:在 https://github.com/FasterXML/jackson-databind/wiki 中查找对应版本的Javadocs
示例
1.对 Person 对象中的 name 属性,通过注解设定使用特定的序列化和反序列化方法。注:此处演示如何使用,不涉及加解密相关。
public class Person {
  private int usrId;
  //指定数据 name 使用特定的序列化和反序列化方法
  @JsonSerialize(using = SecretSerialize.class)
  @JsonDeserialize(using = SecretDeserialize.class)
  private String name;
  public int getUsrId() {
    return usrId;
  }
  public void setUsrId(int usrId) {
    this.usrId = usrId;
  }
  public String getName() {
    return name;
  }
  public void setName(String name) {
    this.name = name;
  }
  @Override
  public String toString() {
    return "Person{" +
        "usrId=" + usrId +
        ", name='" + name + '\'' +
        '}';
  }
}
2.定义 SecretSerialize 类 和 SecretDeserialize 类,并重写其方法
public class SecretSerialize extends JsonSerializer<String> {
  //重写 name 的序列化方法,可在此实现用户定制的加解密或其他操作
  @Override
  public void serialize(String value, JsonGenerator gen, SerializerProvider serializers)
      throws IOException, JsonProcessingException {
    //在数据 name 后增加4个特定字符
    value = value + " &#@";
    //执行序列化操作
    gen.writeString(value);
  }
}
public class SecretDeserialize extends JsonDeserializer<String> {
  //重写 name 的反序列化方法,与serialize序列化方法匹配,按用户定制的规则获取真实数据
  @Override
  public String deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JsonProcessingException {
    //获取反序列化数据,除去4个特定字符,获取真实的 name
    String value = p.getValueAsString();
    value = value.substring(0, value.length() - 4);
    return value;
  }
}