SpringBoot 轻松搞定数据验证 (一)

感谢作者: http://www.spring4all.com/article/1224

对于任何一个应用而言,客户端做的数据有效性验证都不是安全有效的,而数据验证又是一个企业级项目架构上最为基础的功能模块,这时候就要求我们在服务端接收到数据的时候也对数据的有效性进行验证。为什么这么说呢?往往我们在编写程序的时候都会感觉后台的验证无关紧要,毕竟客户端已经做过验证了,后端没必要在浪费资源对数据进行验证了,但恰恰是这种思维最为容易被别人钻空子。毕竟只要有点开发经验的都知道,我们完全可以模拟 HTTP 请求到后台地址,模拟请求过程中发送一些涉及系统安全的数据到后台,后果可想而知....


本章目标

通过 Spring Boot 完成参数后台数据校验,轻松搞定数据有效性验证,留出更多的时间来和小姐姐聊天...


创建项目


查看依赖


    <dependencies>
        <!-- 默认就内嵌了Tomcat 容器,如需要更换容器也极其简单-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!-- 测试包,当我们使用 mvn package 的时候该包并不会被打入,因为它的生命周期只在 test 之内-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>


JSR-303 介绍

   JSR 是Java Specification Requests 的缩写,是指向 JCP(Java Community Process) 提出新增一个标准化技术规范的正式请求。

   任何人都可以提交 JSR,以向 Java 平台增添新的 API 和服务,已审核通过的规范涉及 Java 各个领域,有兴趣可以了解一下。

   Bean Validation 是一个运行时的数据验证框架,为 JavaBean 验证定义了相应的元数据模型和 API。

   默认的元数据是 Java Annotations,当然也可以使用 XML 可以对已存在的元数据信息进行覆盖和扩展。

   在应用中通过使用 Bean Validation 或是你自己定义的 constraint,例如 @NotNull, @Max, @ZipCode, 就可以确保数据模型的正确性。

   constraint 可以注解到字段,getter 方法,类或者接口上面。对于一些特定的需求,用户可以很容易的开发定制化的 constraint。

这里只列举了 javax.validation 包下的注解,同理在 spring-boot-starter-web 包中也存在 hibernate-validator 验证包,里面包含了一些 javax.validation 没有的注解,有兴趣的可以看看 https://www.ibm.com/developerworks/cn/java/j-lo-jsr303/


实体类

为了体现 validation 的强大,分别演示普通参数属性验证与对象的验证

/**
 * @author Ray
 * @date 2018/7/4 0004
 */
public class Book {

    private Integer id;
    @NotBlank(message = "name 不允许为空")
    @Length(min = 2, max = 10, message = "name 长度必须在 {min} - {max} 之间")
    private String name;
    @NotNull(message = "price 不允许为空")
    @DecimalMin(value = "0.1", message = "价格不能低于 {value}")
    private BigDecimal price;
    
    // 省略setter/getter
}


控制层

与前面的代码相比,新的代码中仅仅多了几个注解而已。(此处只是为了图方便写在了 Controller 层,同理你可以将它作用在 Service 层)

/**
 * @author Ray
 * @date 2018/7/4 0004
 * 参数校验
 */
@Validated
@RestController
public class ValidateController1 {

    @GetMapping("/test1")
    public String test1(String name){
        if(name == null){
            throw new NullPointerException("name 不能为空");
        }
        if(name.length() < 2 || name.length() > 10){
            throw new RuntimeException("name 长度必须在 2 - 10 之间");
        }
        return "success";
    }

    @GetMapping("/test2")
    public String test2(@NotBlank(message = "name 不能为空") @Length(min = 2, max = 10, message = "name 长度必须在 {min} - {max} 之间")String name){
        return "success";
    }

    @GetMapping("/test3")
    public String test3(@Validated Book book){
        return "success";
    }
}


测试

完成准备事项后,启动项目自行测试即可,测试手段相信大伙都不陌生了,如 浏览器postmanjunitswagger,此处基于 postman

>test1接口 (name参数)





>test2接口 (name参数没传)





>test3接口 (price参数值过低)



猜你喜欢

转载自blog.csdn.net/q343509740/article/details/80914939