博客
关于我
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/

    你可能感兴趣的文章
    PHP加密与安全的最佳实践
    查看>>
    PHP加速器eaccelerator导致php-fpm进程卡死原因分析
    查看>>
    PHP区分 企业微信浏览器 | 普通微信浏览器 | 其他浏览器
    查看>>
    php原生代码怎么连表查询,PHP tp5中使用原生sql查询代码实例
    查看>>
    PHP去掉转义符
    查看>>
    php去除字符串开头或末尾的字符(例如逗号)
    查看>>
    php反射api
    查看>>
    PHP反射ReflectionClass、ReflectionMethod 入门教程
    查看>>
    PHP反射机制
    查看>>
    php取当天的最后一秒_Docker快速搭建PHP开发环境详细教程
    查看>>
    php取绝对值
    查看>>
    PHP变量内容的获取
    查看>>
    php各种常用的算法
    查看>>
    php各种缓存策略对比
    查看>>
    RabbitMQ高级特性 - 消息分发(限流、负载均衡)
    查看>>
    php后台“爬虫”模拟登录第三方系统
    查看>>
    php后台的在控制器中就可以实现阅读数增加
    查看>>
    php命令行生成项目结构
    查看>>
    php命名空间
    查看>>
    PHP命名空间带来的干扰
    查看>>