服务器端接收到前端传递过来的参数后,很多情况下如果不做校验就直接使用是非常危险的,例如造成 XSS 攻击,把无效数据保存到数据库导致业务出错等。传统的参数校验方式一般是取得每一个参数,然后一个一个的使用 if else 和规则比较进行校验,这样就会有大量的、简单重复的校验代码散布在代码中,不利于维护和阅读。这里介绍使用注解,根据 JSR-303 Validation 进行参数验证。
当我们在 SpringMVC 中需要使用到 JSR-303 的时候就需要我们提供一个对 JSR-303 规范的实现,Hibernate Validator 实现了这一规范,下面将以它作为 JSR-303 的实现来讲解 SpringMVC 对 JSR-303 的支持。
使用方法:
- Bean 中使用 @NotNull 等定义验证规则
 
- Controller 中使用 @Valid 进行参数校验
 
- 如有参数错误,则返回错误信息给客户端
 
校验规则
| Annocation | 
Description | 
| @Null | 
限制只能为null | 
| @NotNull | 
限制必须不为null | 
| @AssertFalse | 
限制必须为false | 
| @AssertTrue | 
限制必须为true | 
| @DecimalMax(value) | 
限制必须为一个不大于指定值的数字 | 
| @DecimalMin(value) | 
限制必须为一个不小于指定值的数字 | 
| @Digits(integer,fraction) | 
限制必须为一个小数,且整数部分的位数不能超过integer,小数部分的位数不能超过fraction | 
| @Future | 
限制必须是一个将来的日期 | 
| @Max(value) | 
限制必须为一个不大于指定值的数字 | 
| @Min(value) | 
限制必须为一个不小于指定值的数字 | 
| @Past | 
限制必须是一个过去的日期 | 
| @Pattern(value) | 
限制必须符合指定的正则表达式 | 
| @Size(max,min) | 
限制字符长度必须在min到max之间 | 
Gradle 依赖
1
   | compile('org.hibernate:hibernate-validator:5.4.0.Final')
  | 
 
Bean 中定义校验规则
类 Demo 的属性定义的时候给定校验规则,校验规则能够复合使用。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
   | package com.xtuer.bean;
  import lombok.Getter; import lombok.Setter; import org.hibernate.validator.constraints.NotBlank; import javax.validation.constraints.Min; import javax.validation.constraints.NotNull;
  @Getter @Setter public class Demo {     @NotNull(message="ID 不能为 null")     @Min(value=1, message="ID 不能小于 1")     private Long id;
      @NotBlank(message="Info 不能为空")     private String info;
      public Demo() {     }
      public Demo(Long id, String info) {         this.id = id;         this.info = info;     } }
   | 
 
Controller 中校验参数
@Valid 表示需要对其注解的对象进行参数校验。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
   | package com.xtuer.controller;
  @Controller public class DemoController {                    @GetMapping(UriView.URI_DEMO_VALIDATE)     @ResponseBody     public Result validateDemo(@Valid Demo demo, BindingResult bindingResult) {                  if (bindingResult.hasErrors()) {             return Result.fail(CommonUtils.getBindingMessage(bindingResult));         }
          return Result.ok("", demo);     } }
   | 
 
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
   | package com.xtuer.util;
  import org.springframework.validation.BindingResult; import org.springframework.validation.FieldError;
  public class CommonUtils {     
 
 
 
 
 
      public static String getBindingMessage(BindingResult result) {         StringBuffer sb = new StringBuffer();
          for (FieldError error : result.getFieldErrors()) {                          sb.append(error.getDefaultMessage() + "\n");         }
          return sb.toString();     } }
   | 
 
参考资料