博客
关于我
DTO数据传输对象详解
阅读量:537 次
发布时间:2019-03-08

本文共 2275 字,大约阅读时间需要 7 分钟。

数据传输对象(DTO)分析与应用实例

什么是DTO?

数据传输对象(DTO,Data Transfer Object)是一种在面向服务架构(SOA)设计中用于数据传输的设计模式。其核心作用是为了在分布式系统中实现客户端和服务端之间的数据传输,避免直接将敏感数据传递至业务逻辑层。

简单来说,假设你有一个 User 实体类,包含用户的基本信息(如用户名、密码、邮箱、手机号等);当用户登录时,通常只需要提供用户名和密码。服务端可以将这些传入的数据通过 LoginDto 实体类进行封装,从而避免直接将敏感数据传递至服务层。


DTO解决了什么问题?

DTO 模式解决了以下几个关键问题:

  • 客户端与服务器端之间的数据不一致问题:通过DTO将数据结构化,确保客户端和服务器端对数据的理解保持一致。
  • 服务单一化接口的问题:避免在接口中直接传输实体类,导致接口泛滥。
  • 数据传输量过大问题:通过对数据进行结构化和筛选,减少数据传输的开销。
  • 数据传输作用域过大的问题:将只需要传输的部分数据提取出来,减少跨层次的数据泄露。

  • 代码案例解析

    服务层接口

    @RestControllerpublic class AccountController {        @Autowired    private UserService userService;        @Autowired    private JwtUtil jwtUtil;        @PostMapping("/login")    public Result login(@Validated @RequestBody LoginDto loginDto, HttpServletResponse response) {        // 通过loginDto获取用户信息        User user = userService.getOne(new QueryWrapper
    ().eq("username", loginDto.getUsername())); if (!user.getPassword().equals(SecureUtil.md5(loginDto.getPassword()))) { return Result.fail("密码不正确!"); } String jwt = jwtUtil.generateToken(user.getId()); response.setHeader("Authorization", jwt); response.setHeader("Access-Control-Expost-Headers", "Authorization"); return Result.success(MapUtil.builder().put("id", user.getId())); }}

    DTO 实体类

    @Datapublic class LoginDto implements Serializable {        @NotBlank(message = "用户名不能为空!", name = "username")    private String username;        @NotBlank(message = "密码不能为空!", name = "password")    private String password;}

    对比 User 实体类

    @Data@Table(name = "m_user")public class User extends BaseEntity {        @TableId(type = IdType.AUTO)    private Long id;        @NotBlank(message = "昵称不能为空~")    private String username;        private String avatar;        @NotBlank(message = "邮箱不能为空~")    @Email(message = "邮箱格式不正确~")    private String email;        private String password;        private Integer status;        private LocalDateTime created;    private LocalDateTime lastLogin;}

    优点解读

  • 数据隔离:DTO 实体类仅包含需要传输的字段,避免了不必要的数据传输。
  • 安全性:通过数据转换层(如LoginDto)将敏感数据与业务逻辑层解耦,降低了数据泄露风险。
  • 高效性:通过对数据进行校验和转换,减少了业务逻辑层的负载压力。

  • DTO 在实际开发中的应用场景

  • 数据传输:将前端传递的数据结构化为DTO格式,接收后再转换为业务对象。
  • 数据验证:在数据传输过程中对 DTO 进行参数校验,确保数据完整性。
  • 接口统一规范:定义统一的 DTO 接口,避免接口冗余,提升系统设计质量。

  • 通过以上实例可以看出,DTO 帮助我们在分布式系统中更好地处理数据传输问题,为系统设计和实现提供了更加灵活和安全的解决方案。

    转载地址:http://huyiz.baihongyu.com/

    你可能感兴趣的文章
    Node出错导致运行崩溃的解决方案
    查看>>
    Node响应中文时解决乱码问题
    查看>>
    node基础(二)_模块以及处理乱码问题
    查看>>
    node安装卸载linux,Linux运维知识之linux 卸载安装node npm
    查看>>
    node安装及配置之windows版
    查看>>
    Node实现小爬虫
    查看>>
    Node提示:error code Z_BUF_ERROR,error error -5,error zlib:unexpected end of file
    查看>>
    Node提示:npm does not support Node.js v12.16.3
    查看>>
    Node搭建静态资源服务器时后缀名与响应头映射关系的Json文件
    查看>>
    Node服务在断开SSH后停止运行解决方案(创建守护进程)
    查看>>
    node模块化
    查看>>
    node模块的本质
    查看>>
    node环境下使用import引入外部文件出错
    查看>>
    node环境:Error listen EADDRINUSE :::3000
    查看>>
    Node的Web应用框架Express的简介与搭建HelloWorld
    查看>>
    Node第一天
    查看>>
    node编译程序内存溢出
    查看>>
    Node读取并输出txt文件内容
    查看>>
    node防xss攻击插件
    查看>>
    noi 1996 登山
    查看>>