讲师中心 微信公众号
AI工具推荐 视频效率加速

在Java关联关系中隐藏敏感数据:@JsonProperty详解

风静小哥_5900

风静小哥_5900

发布时间:2025-10-26 10:34:23

|

568人浏览过

|

来源于php中文网

原创

在Java关联关系中隐藏敏感数据:@JsonProperty详解

本文旨在探讨在java应用中,如何有效处理dto(数据传输对象)关联关系中敏感数据的json序列化问题。我们将重点介绍如何利用jackson库的`@jsonproperty(access = jsonproperty.access.write_only)`注解,在嵌套对象中精确控制字段的可见性,从而在api响应中隐藏如密码、年龄等敏感信息,确保数据隐私和安全性。文章还将讨论其他实现方式及其适用场景与局限性。

在构建RESTful API时,我们经常会遇到需要将关联对象作为嵌套结构返回的情况。例如,一个BillsDto可能包含一个UserDto,而UserDto中又含有如用户名、密码或年龄等不应暴露给客户端的敏感信息。如何在不修改父级DTO(如BillsDto)的情况下,有效地隐藏这些嵌套对象的敏感字段,是API设计中一个常见的挑战。

核心方案:在嵌套DTO中控制序列化行为

解决此类问题的最直接且推荐的方法是,在包含敏感数据的DTO(即嵌套DTO)本身上应用序列化控制注解。Jackson库提供了强大的@JsonProperty注解,配合其access属性,可以精确地控制字段在序列化和反序列化过程中的行为。

当我们需要隐藏某个字段,使其在JSON响应中不出现,但允许在接收请求时进行反序列化(例如,创建或更新用户时),可以使用JsonProperty.Access.WRITE_ONLY。

以下是UserDto的示例,演示了如何隐藏username、password和age字段:

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

import com.fasterxml.jackson.annotation.JsonProperty;

public class UserDto {

    private String number_id;

    @JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
    private String username;

    @JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
    private String password;

    private String firstName;
    private String lastName;

    @JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
    private String age;

    // Getter和Setter方法 (省略)
}

而BillsDto则无需做任何改动:

import java.util.Date;

public class BillsDto {

    private String numberBills;
    private double amount;
    private Date deadlinePayment;
    private UserDto user; // UserDto中的敏感字段将自动被隐藏

    // Getter和Setter方法 (省略)
}

当BillsDto对象被序列化为JSON时,其中嵌套的UserDto实例将根据其自身定义的@JsonProperty规则进行处理。这意味着username、password和age字段将不会出现在最终的JSON输出中。

为什么这是推荐的方法?

Expanso json-flatten
Expanso json-flatten

通过 CLI 或 MCP 服务器,使用 Expanso Edge 管道扁平化嵌套 JSON 对象。

下载
  1. 单一职责原则: UserDto作为用户数据的载体,其序列化策略应由自身定义。无论UserDto被哪个其他DTO引用,其敏感字段的隐藏策略都保持一致。
  2. 避免遗漏: 如果将序列化控制逻辑放在引用方(如BillsDto),那么每当UserDto被其他DTO(如OrderDto、CommentDto)引用时,都需要重复配置,容易造成遗漏,从而意外暴露敏感数据。
  3. 代码清晰与可维护性: 敏感字段的隐藏逻辑直接与其所属的DTO关联,代码更易于理解和维护。

备选方案:通过自定义序列化器在父DTO中控制

如果由于某些特殊限制,您无法修改嵌套的UserDto类,而只能在BillsDto中进行修改,那么可以考虑为UserDto实现一个自定义的JSON序列化器,并通过@JsonSerialize注解将其应用到BillsDto中的user字段上。

例如:

  1. 创建自定义序列化器:

    import com.fasterxml.jackson.core.JsonGenerator;
    import com.fasterxml.jackson.databind.SerializerProvider;
    import com.fasterxml.jackson.databind.ser.std.StdSerializer;
    import java.io.IOException;
    
    public class UserDtoPublicSerializer extends StdSerializer<UserDto> {
    
        public UserDtoPublicSerializer() {
            this(null);
        }
    
        public UserDtoPublicSerializer(Class<UserDto> t) {
            super(t);
        }
    
        @Override
        public void serialize(UserDto user, JsonGenerator generator, SerializerProvider provider) throws IOException {
            generator.writeStartObject();
            generator.writeStringField("number_id", user.getNumber_id());
            generator.writeStringField("firstName", user.getFirstName());
            generator.writeStringField("lastName", user.getLastName());
            // 明确不写入 username, password, age
            generator.writeEndObject();
        }
    }
  2. 在BillsDto中应用自定义序列化器:

    import com.fasterxml.jackson.databind.annotation.JsonSerialize;
    import java.util.Date;
    
    public class BillsDto {
    
        private String numberBills;
        private double amount;
        private Date deadlinePayment;
    
        @JsonSerialize(using = UserDtoPublicSerializer.class)
        private UserDto user;
    
        // Getter和Setter方法 (省略)
    }

注意事项:

尽管此方法可行,但通常不推荐作为首选。它的主要缺点在于:

  • 分散控制: 敏感数据隐藏的逻辑分散在多个地方,增加了维护复杂性。
  • 易出错: 如果UserDto被其他DTO引用,很容易忘记应用自定义序列化器,从而导致敏感数据泄露。
  • 重复工作: 每当需要以不同方式序列化UserDto时,可能需要创建多个自定义序列化器。

最佳实践与总结

在处理Java中DTO关联关系的敏感数据序列化时,以下是一些最佳实践:

  1. 优先在源DTO中定义序列化策略: 始终尝试在包含敏感数据的DTO(如UserDto)内部使用@JsonProperty(access = JsonProperty.Access.WRITE_ONLY)来控制字段的可见性。这遵循了单一职责原则,并确保了数据隐私策略的一致性。
  2. DTO分层设计: 对于复杂场景,可以考虑为不同的视图或API接口设计不同的DTO。例如,可以有一个UserPrivateDto(包含所有字段)和一个UserPublicDto(只包含非敏感字段),根据业务需求选择使用。这样可以更清晰地分离数据模型和API输出模型。
  3. 数据安全意识: 在设计API时,始终将数据安全放在首位。仔细审查每个API响应,确保没有意外暴露敏感信息。
  4. 利用Jackson的强大功能: Jackson库提供了丰富的注解和配置选项来控制JSON序列化和反序列化行为,如@JsonIgnore、@JsonInclude、@JsonFilter等,熟练掌握它们能帮助您构建健壮且安全的API。

通过上述方法,您可以有效地管理Java关联关系中敏感数据的JSON序列化,从而提升API的安全性与健壮性。

热门AI工具

更多
豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

VibeKnow
VibeKnow Hot

一款AI视频创作工具,主要用于全球首个AI知识视频创作平台,文档、文章、网页,一键生成视频,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

立刻MV
立刻MV Hot

立刻MV是一款AI文本写作工具,AI 音乐视频(MV)创作工具。

超级麦吉

一款通过数字员工协作完成调研、数据分析与文档制作的AI办公平台。

音述AI
音述AI Hot

一款AI音频处理工具,主要用于音述AI是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区,适合需要提升相关任务效率的用户。

讯飞智作

讯飞智作是一款AI视频创作工具,AI文本配音工具,数字人课程、营销视频制作。

相关专题

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

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

564

2025.11.26

json数据格式
json数据格式

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

2235

2023.08.07

json是什么
json是什么

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

3562

2023.08.23

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

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

1196

2023.10.13

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

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

4099

2025.09.10

硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

3208

2023.10.19

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

5189

2025.10.17

php8.4实现接口限流的教程
php8.4实现接口限流的教程

PHP8.4本身不内置限流功能,需借助Redis(令牌桶)或Swoole(漏桶)实现;文件锁因I/O瓶颈、无跨机共享、秒级精度等缺陷不适用高并发场景。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

3849

2025.12.29

Uvicorn使用教程
Uvicorn使用教程

本专题汇总了Uvicorn使用教程与启动运行指南,涵盖其作为Python ASGI服务器的定位与特点,以及命令行启动(uvicorn main:app --reload)、参数配置(host/port/workers)、程序内嵌运行与Gunicorn结合部署等核心用法。同时整理了热重载调试、日志配置与生产环境部署优化等技巧,助你快速掌握Uvicorn的运行与配置。

0

2026.11.02

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
dev.java 官方:Learn Java
dev.java 官方:Learn Java

共0课时 | 0人学习

Java JDBC数据库连接官方教程
Java JDBC数据库连接官方教程

共0课时 | 0人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn