前言
在进行web开发时,使用springboot开发的web项目 ,前端想后端传入参数时,使用post 或者put提交时 ,后台往往使用VO类进行接收,我们要对入参的格式进行校验,这里说明不能单单的只进行前端校验。防止他人绕过网页进行数据提交。
前提我们这里所说的所有规则都基于JSR303
规则
JSR是Java Specification Requests的缩写,意思是Java 规范提案。
是指向JCP(Java Community Process)提出新增一个标准化技术规范的正式请求。
任何人都可以提交JSR,以向Java平台增添新的API和服务。JSR已成为Java界的一个重要标准。
这里要介绍的是基于注解的方式进行校验
- 首先 要先确定你使用的springboot的版本是否高于2.3.x版本,超过的话加入以下依赖。
<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator</artifactId>
<version>6.0.20.Final</version>
</dependency>
我们实际中经常使用的有:
@ NotNull
@ Null
@ NotBlank
@ URL
@ Pattern
@ Min
@ Max
@ Email
@ Length
等等一些。这些都是javax.validation.constraints包下的。我们只需要在controller层的方法中接收实体类前加上@Validated
或者@Valid
注解即可完成入参校验。
- 当然这些校验规则也是支持分组校验的。
举例:
@ NotNull(groups = {UpdateGroup.class}))
说明:
UpdateGroup.class 为自定义的一个接口,不需要继承或定义任何属性,只起标识作用。
例如我定义的接口规定为更新组。我们只需要在更新的controller方法的VO实体类前面添加@Validated(UpdateGroup.class)
给他设置校验组即可让上面的注解生效。
注意:
当@Validated(UpdateGroup.class)
设置校验组后,实体类上没有规定所属组的注解将不生效。
实现自定义校验
- 编写一个自定义校验注解
- 编写一个自定义的校验器
- 关联自定义的校验器和自定义校验注解
下面开始编码:
我们这里自定义一个校验注解@ListValue(vals = {0,1},groups = {AddGroup.class})
- 自定义校验注解
import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.*;
/*
*
* 自定义校验注解
*
* */
@Documented
// 使用什么校验器校验 这里是一个集合,可以设置多个类型,会自动去匹配
@Constraint(
validatedBy = {ListValueConstraintValidator.class}
)
@Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.PARAMETER, ElementType.TYPE_USE})
@Retention(RetentionPolicy.RUNTIME)
public @interface ListValue {
// 可以读取配置文件中的也可以在这里写死
String message() default "{com.wdhcr.common.valid.ListValue.message}";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
// 以上三个属性 只要规范 JSR303 规则 就必须有以上三个属性。
// 下面的为自定义的属性
int[] vals() default {};
}
在resources 目录下 创建ValidationMessages.properties配置文件 在配置文件中添加后面的配置:
com.wdhcr.common.valid.ListValue.message = 只能设置规定的值
String message() default “{com.wdhcr.common.valid.ListValue.message}”;
- 自定义校验器
import org.springframework.util.ObjectUtils;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import java.util.HashSet;
import java.util.Set;
/*
* @ListValue 的自定义校验器
*
*
* */
public class ListValueConstraintValidator implements ConstraintValidator<ListValue,Integer> {
private Set<Integer> set = new HashSet<Integer>();
/*
* 初始化方法
*
* */
@Override
public void initialize(ListValue constraintAnnotation) {
int[] vals = constraintAnnotation.vals();
for (int val : vals) {
if (!ObjectUtils.isEmpty(val)) {
set.add(val);
}
}
}
// 判断是否校验成功
@Override
public boolean isValid(Integer value, ConstraintValidatorContext context) {
// 判断是否包含传进来的值
return set.contains(value);
}
}
ConstraintValidator<ListValue,Integer>
ListValue: 为自定义校验注解
Integer:为注解要校验的数据类型。可以设置为double 等等。