一、前言
数据的校验是交互式网站一个不可或缺的功能,前端的js校验可以涵盖大部分的校验职责,如用户名唯一性,生日格式,邮箱格式校验等等常用的校验。但是为了避免用户绕过浏览器,使用http工具直接向后端请求一些违法数据,服务端的数据校验也是必要的,可以防止脏数据落到数据库中,如果数据库中出现一个非法的邮箱格式,也会让运维人员头疼不已。可以使用本文将要介绍的validation来对数据进行校验。
二、常用校验
1、JSR303/JSR-349
JSR303是一项标准,只提供规范不提供实现,规定一些校验规范即校验注解,如@Null,@NotNull,@Pattern,位于javax.validation.constraints包下。JSR-349是其的升级版本,添加了一些新特性。
@Null //被注释的元素必须为null @NotNull //被注释的元素必须不为null @AssertTrue //被注释的元素必须为true @AssertFalse //被注释的元素必须为false @Min(value) //被注释的元素必须是一个数字,其值必须大于等于指定的最小值 @Max(value) //被注释的元素必须是一个数字,其值必须小于等于指定的最大值 @DecimalMin(value) //被注释的元素必须是一个数字,其值必须大于等于指定的最小值 @DecimalMax(value) //被注释的元素必须是一个数字,其值必须小于等于指定的最大值 @Size(max, min) //被注释的元素的大小必须在指定的范围内 @Digits (integer, fraction) //被注释的元素必须是一个数字,其值必须在可接受的范围内 @Past //被注释的元素必须是一个过去的日期 @Future //被注释的元素必须是一个将来的日期 @Pattern(value) //被注释的元素必须符合指定的正则表达式
2、hibernate validation
hibernate validation是对这个规范的实现,并增加了一些其他校验注解,如@Email,@Length,@Range等等
@Email //被注释的元素必须是电子邮箱地址 @Length(min=, max=) //被注释的字符串的大小必须在指定的范围内 @NotEmpty //被注释的字符串的必须非空 @Range(min=, max=) //被注释的元素必须在合适的范围内 @NotBlank //字符串不能为null,字符串trin()后也不能等于“” @URL(protocol=,host=, port=, regexp=, flags=) //被注释的字符串必须是一个有效的url
3、spring validation
spring validation对hibernate validation进行了二次封装,在springmvc模块中添加了自动校验,并将校验信息封装进了特定的类中。
package com.example.validation.domain; import javax.validation.constraints.Pattern; import org.hibernate.validator.constraints.Length; import org.hibernate.validator.constraints.NotBlank; import org.hibernate.validator.constraints.NotEmpty; import org.hibernate.validator.constraints.Range; public class User { @NotBlank(message = "用户名称不能为空。") private String name; @Range(max = 150, min = 1, message = "年龄范围应该在1-150内。") private Integer age; @NotEmpty(message = "密码不能为空") @Length(min = 6, max = 8, message = "密码长度为6-8位。") @Pattern(regexp = "[a-zA-Z]*", message = "密码不合法") private String password;
三、测试
1、准备工作
引入相关依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-validation</artifactId> /dependency>
还引入了lombok、SpringBoot的web、test等基础依赖,这里就不一 一给出了。
2、测试所用模型为:
import lombok.Getter; import lombok.Setter; import org.hibernate.validator.constraints.Length; import org.hibernate.validator.constraints.Range; import org.hibernate.validator.constraints.URL; import javax.validation.constraints.*; import java.util.Date; import java.util.List; import java.util.Map; /** * Validation注解 * * @author JustryDeng * @date 2019/1/15 0:43 */ public class ValidationBeanModel { @Setter @Getter public class AbcAssertFalse { @AssertFalse private Boolean myAssertFalse; } @Setter @Getter public class AbcAssertTrue { @AssertTrue private Boolean myAssertTrue; } @Setter @Getter public class AbcDecimalMax { @DecimalMax(value = "12.3") private String myDecimalMax; } @Setter @Getter public class AbcDecimalMin { @DecimalMin(value = "10.3") private String myDecimalMin; } @Setter @Getter public class AbcDigits { @Digits(integer = 5, fraction = 3) private Integer myDigits; } @Setter @Getter public class AbcEmail { @Email private String myEmail; } @Setter @Getter public class AbcFuture { @Future private Date myFuture; } @Setter @Getter public class AbcLength { @Length(min = 5, max = 10) private String myLength; } @Setter @Getter public class AbcMax { @Max(value = 200) private Long myMax; } @Setter @Getter public class AbcMin { @Min(value = 100) private Long myMin; } @Setter @Getter public class AbcNotBlank { @NotBlank private String myStringNotBlank; @NotBlank private String myObjNotBlank; } @Setter @Getter public class AbcNotEmpty { @NotEmpty private String myStringNotEmpty; @NotEmpty private String myNullNotEmpty; @NotEmpty private Map<String, Object> myMapNotEmpty; @NotEmpty private List<Object> myListNotEmpty; @NotEmpty private Object[] myArrayNotEmpty; } @Setter @Getter public class AbcNotNull { @NotNull private String myStringNotNull; @NotNull private Object myNullNotNull; @NotNull private Map<String, Object> myMapNotNull; } @Setter @Getter public class AbcNull { @Null private String myStringNull; @Null private Map<String, Object> myMapNull; } @Setter @Getter public class AbcPast { @Past private Date myPast; } @Setter @Getter public class AbcPattern { @Pattern(regexp = "\\d+") private String myPattern; } @Setter @Getter public class AbcRange { @Range(min = 100, max = 100000000000L) private Double myRange; } @Setter @Getter public class AbcSize { @Size(min = 3, max = 5) private List<Integer> mySize; } @Setter @Getter public class AbcURL { @URL private String myURL; } }