Java中排除敏感字段需按序列化机制选择方案:原生用transient;Jackson用@JsonIgnore或@JsonIgnoreProperties;FastJson用@JSONField(serialize=false);根本防护是DTO隔离与分层建模。

Java 中排除敏感字段不被序列化,不能只靠一种方式,得看用的是哪种序列化机制。不同场景下,有效手段完全不同。
原生 Java 序列化:用 transient 关键字
仅对 ObjectOutputStream / ObjectInputStream 有效,是 JDK 内置序列化的标准做法:
- 在字段前加
transient,如private transient String password; - 反序列化后该字段值为
null(基本类型为默认值),需业务逻辑自行处理 - 注意:
transient对 JSON、XML、日志打印、数据库操作完全无效
JSON 序列化(Jackson):用 @JsonIgnore 或 @JsonIgnoreProperties
Spring Boot 默认使用 Jackson,这是最常见也最推荐的 Web 场景防护方式:
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
-
@JsonIgnore标在字段或 getter 上,单字段屏蔽 -
@JsonIgnoreProperties({"password", "idCard"})标在类上,批量屏蔽 - 支持更细粒度控制,比如只禁序列化、不禁反序列化(
allowSetters = true)
FastJson 序列化:用 @JSONField(serialize = false)
若项目仍在使用 FastJson(尤其老系统),推荐直接注解控制:
立即学习“Java免费学习笔记(深入)”;
@JSONField(serialize = false) private String token;- 也可配合
SimplePropertyPreFilter动态过滤,适合运行时策略调整 - 注意字段名大小写:过滤器中指定的是 JSON key 名,不是 Java 属性名
根本性防护:分层建模 + DTO 隔离
比“加关键字”更可靠的做法,是从架构上避免敏感字段暴露:
- 数据库实体(PO)不直接返回给前端,而是定义专用响应类(DTO),里面根本不声明
password字段 - 敏感字段如密钥、token 尽量用
char[]存储,并在使用后立即清空 - CI 流程中接入 SpotBugs 检查
SE_BAD_FIELD,自动拦截未保护的敏感字段

















