如何安全使用Java DTO | Snyk


Java中的数据传输对象(DTO)是在子系统之间传输数据的对象。它是一种用于聚合数据的企业设计模式。主要目的是减少子系统之间所需的系统调用次数,从而减少所产生的开销。

普通旧Java对象(Plain Old Java Object,POJO)是一个普通的Java对象。它可以是任何类,并且除了Java语言规定的限制外,不受任何特定限制的约束。创建它们是为了可重用性和增加可读性。

DTO可以实现为POJO,也可以实现为JavaBean。最重要的是,DTO将实体(例如表示层和域模型)之间的关注点分开。

什么是好的DTO?
DTO的用途是在进程之间传送数据。因此,一个好的DTO只包含系统的特定部分所需的信息。在我们的API示例中,我们只需要返回客户的姓名和他们最喜欢的咖啡订单。不需要添加任何其他内容,如业务逻辑。一般建议是使DTO尽可能简单、小和直接。

另外,DTO初始化后,其状态不应改变或演变。这意味着不可变的数据结构将非常适合DTO。由于DTO只携带不应改变的数据,Java Record将非常适合-特别是因为JSON序列化库(如杰克逊)支持Java Record。、

在Java中使用DTO来分离子系统通常是一个好主意。从工程的角度来看,这将减少不同层之间的往返,并形成一个安全角度,这将有助于防止意外的数据泄漏。在安全性方面,我建议使您的DTO具体化,并限制重用的数量。如果您为不同的功能重用DTO,您应该在更改这些DTO之前清楚地了解它们的使用位置。

一般来说,保持DTO简洁,如果可能的话,不包含业务逻辑,并且只提供特定功能所需的数据。最后,我相信不变性是DTO的天然选择,这使得Java Records(在Java 16中完全发布)成为在Java中实现DTO的一种很好的方式。