0

0

如何在Java关联关系中隐藏敏感数据(使用@JsonProperty)

聖光之護

聖光之護

发布时间:2025-10-27 11:36:35

|

923人浏览过

|

来源于php中文网

原创

如何在Java关联关系中隐藏敏感数据(使用@JsonProperty)

本文旨在探讨在java restful api开发中,如何有效隐藏嵌套对象中的敏感数据,特别是在使用jackson库进行json序列化时。我们将重点介绍利用`@jsonproperty(access = jsonproperty.access.write_only)`注解在数据传输对象(dto)层级控制字段可见性的方法,并强调其作为最佳实践的优势,以确保数据安全性和api响应的简洁性。

在构建RESTful API时,返回给客户端的数据通常需要经过精心筛选,以避免泄露敏感信息。当一个数据传输对象(DTO)中包含另一个DTO作为其属性时,例如BillsDto中包含UserDto,隐藏嵌套对象中的特定敏感字段就成为一个常见的需求。例如,在BillsDto的API响应中,我们可能不希望暴露关联UserDto中的username、password和age等字段。

理解Jackson的序列化控制

Java生态中,Jackson是处理JSON序列化和反序列化的主流库。它提供了丰富的注解来控制对象到JSON的转换过程。其中,@JsonProperty注解是一个强大的工具,它不仅可以用于字段的重命名,还可以通过其access属性来精细控制字段的读写权限。

使用 @JsonProperty(access = JsonProperty.Access.WRITE_ONLY) 隐藏敏感字段

要隐藏嵌套对象中的敏感数据,最推荐且最直接的方法是在定义敏感字段的原始DTO类中应用@JsonProperty注解,并将其access属性设置为JsonProperty.Access.WRITE_ONLY。

JsonProperty.Access.WRITE_ONLY的含义是:

立即学习Java免费学习笔记(深入)”;

  • 序列化时(写入JSON): 该字段将被忽略,不会出现在生成的JSON字符串中。
  • 反序列化时(从JSON读取): 该字段可以被正常地从传入的JSON数据中读取并设置到对象中。

这种方法将数据隐藏的策略直接嵌入到数据源(即UserDto)本身,无论UserDto在何处被引用,其敏感字段都将遵循这一序列化策略。

一帧秒创
一帧秒创

基于秒创AIGC引擎的AI内容生成平台,图文转视频,无需剪辑,一键成片,零门槛创作视频。

下载

以下是修改后的UserDto示例:

import com.fasterxml.jackson.annotation.JsonProperty;

public class UserDto {

    private String number_id;

    // 序列化时隐藏username,反序列化时允许写入
    @JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
    private String username;

    // 序列化时隐藏password,反序列化时允许写入
    @JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
    private String password;

    private String firstName;
    private String lastName;

    // 序列化时隐藏age,反序列化时允许写入
    @JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
    private String age;

    // Getters and Setters (省略)
}

而BillsDto则无需进行任何修改:

import java.util.Date;

public class BillsDto {

    private String numberBills;
    private double amount;
    private Date deadlinePayment;
    private UserDto user; // 引用UserDto,其内部敏感字段已通过@JsonProperty控制

    // Getters and Setters (省略)
}

当BillsDto对象被序列化为JSON时,其内部的user对象将自动遵循UserDto中定义的序列化规则,即username、password和age字段将不会出现在最终的JSON输出中。

为什么这是最佳实践?

  1. 集中管理: 序列化策略在UserDto内部定义,实现了策略与数据模型的高度耦合。这意味着无论UserDto在BillsDto、OrdersDto或其他任何DTO中被引用,其敏感字段都会被一致地隐藏。
  2. 减少错误: 避免了在每个引用UserDto的DTO中重复配置序列化逻辑,从而大大降低了因遗漏配置而导致敏感数据泄露的风险。
  3. 清晰性: 代码意图明确,开发人员一眼就能看出哪些字段是敏感的,不应在序列化输出中暴露。
  4. 可维护性: 如果需要更改敏感字段的可见性,只需修改UserDto一处即可。

替代方案(不推荐)

虽然可以通过在BillsDto的user字段上使用@JsonSerialize注解,并提供一个自定义的UserDto序列化器来实现类似的效果,但这种方法通常不被推荐:

// 不推荐的示例:
public class BillsDto {
    // ... 其他字段
    @JsonSerialize(using = CustomUserDtoSerializer.class) // 不推荐,将序列化逻辑分散
    private UserDto user;
    // ...
}

不推荐的原因:

  • 分散管理: 序列化逻辑分散在多个引用UserDto的DTO中,增加了管理复杂性。
  • 易出错: 很容易忘记在某个地方应用自定义序列化器,导致敏感数据意外暴露。
  • 冗余代码: 可能需要在多个地方编写或引用相同的自定义序列化逻辑。

总结

在Java应用中处理嵌套对象敏感数据隐藏时,利用Jackson的@JsonProperty(access = JsonProperty.Access.WRITE_ONLY)注解直接在原始DTO(例如UserDto)中定义序列化策略是最高效、最安全且最易于维护的方法。它确保了数据隐藏的一致性,减少了潜在的错误,并提升了代码的清晰度和可维护性。始终将数据隐藏的策略与其所属的数据模型紧密结合,是构建健壮和安全API的关键。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
PHP API接口开发与RESTful实践
PHP API接口开发与RESTful实践

本专题聚焦 PHP在API接口开发中的应用,系统讲解 RESTful 架构设计原则、路由处理、请求参数解析、JSON数据返回、身份验证(Token/JWT)、跨域处理以及接口调试与异常处理。通过实战案例(如用户管理系统、商品信息接口服务),帮助开发者掌握 PHP构建高效、可维护的RESTful API服务能力。

179

2025.11.26

json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

455

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

546

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

334

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

82

2025.09.10

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

760

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

221

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1566

2023.10.24

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

3

2026.03.11

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 4.3万人学习

C# 教程
C# 教程

共94课时 | 11.1万人学习

Java 教程
Java 教程

共578课时 | 80.6万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号