-
数据校验分为客户端验证和服务器端验证,客户端验证主要是过滤正常用户的误操作,通过 JavaScript 代码完成(容易被攻击)。服务器端验证是整个应用阻止非法数据的核心,需要在应用中编程实现。
-
springmvc提供两种验证方式
spring自带的验证框架
JSR303校验框架: Java 为 Bean 数据合法性校验所提供的标准框架。JSR303 通过在 Bean 属性上标注类似于 @NotNull、@Max 等标准的注解制定校验规则,并通过标准的验证接口对 Bean 进行验证
- 使用JSR303校验框架不需要编写验证类,直接在实体类属性和变量上加注解实现
- 但spring自身没有对jsr303实现,而hibernate-validator对其进行了实现,所以需要导入hibernate-validator的依赖,Spring 将会自动加载并装配。
javax.validation validation-api 2.0.1.Final org.jboss.logging jboss-logging 3.1.0.CR2 org.hibernate.validator hibernate-validator 7.0.4.Final
- javax validator内置注解:
名称 | 说明 |
---|---|
@Null | 被标注的元素必须为 null |
@NotNull | 被标注的元素必须不为 null |
@AssertTrue | 被标注的元素必须为 true |
@AssertFalse | 被标注的元素必须为 false |
@Min(value) | 被标注的元素必须是一个数字,其值必须大于等于指定的最小值 |
@Max(value) | 被标注的元素必须是一个数字,其值必须小于等于指定的最大值 |
@DecimalMax(value) | 被标注的元素必须是一个数字,其值必须大于等于指定的最大值 |
@DecimalMin(value) | 被标注的元素必须是一个数字,其值必须小于等于指定的最小值 |
@size | 被标注的元素的大小必须在指定的范围内 |
@Digits(integer,fraction) | 被标注的元素必须是一个数字,其值必须在可接受的范围内;integer 指定整数精度,fraction 指定小数精度 |
@Past | 被标注的元素必须是一个过去的日期 |
@Future | 被标注的元素必须是一个将来的日期 |
@Pattern(value) | 被标注的元素必须符合指定的正则表达式 |
Hibernate Validator 附加的注解:
@Email:被注释的元素必须是电子邮箱地址
@Length:被注释的字符串的大小必须在指定的范围内
@NotEmpty:被注释的字符串的必须非空
@Range:被注释的元素必须在合适的范围内
@NotBlank:验证字符串非null,且长度必须大于0
- 关于@NotNull,@NotEmpty和@NotBlank之间的区别如以下
@NotNull 适用于任何类型,被标注的元素必须不能为null
@NotEmpty适用于String类型,Map类型或者数组,不能为null,且长度必须大于0
@NotBlank只能用于String类型,不能为null,且调用trim()后,长度必须大于0
通过注解驱动的方式来进行数据校验,Spring 的 DataBinder 在进行数据绑定时,可同时调用校验框架来完成数据校验工作
对同一个Model,我们在增加和修改时对参数的校验也是不一样的,这个时候我们就需要定义分组验证上面每个注解里面有个groups 属性,可以设置不同的操作类add/modify接口值,来进行分组验证参数
添加完需要的校验注解之后,在请求处理方法中的接收的请求参数上添加@Valid注解,即可开启校验功能 如果是分组校验则需要 @Validated 注解
-
举例测试:
-
导入上面的3个依赖:注意jboss-logging版本不要用最新版3.1.0.CR2左右,否则容器加载异常
-
实体类,注意导入注解的包
package com.zk.pojo; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import org.hibernate.validator.constraints.Email; import org.hibernate.validator.constraints.Length; import org.springframework.stereotype.Component; import org.springframework.validation.annotation.Validated; import javax.validation.constraints.NotNull; import javax.validation.constraints.Pattern; @Data @AllArgsConstructor @NoArgsConstructor public class User { @NotNull(message="账户不为空!") private String username; @NotNull @Length(min = 6, max = 32, message = "用户名不能少于6位大于32位") private String pwd; @Pattern(regexp = "^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$",message = "邮箱格式不正确!") private String email; }
- 控制类
package com.zk.controller; import com.alibaba.fastjson2.JSON; import com.zk.pojo.User; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.validation.BindingResult; import org.springframework.validation.FieldError; import org.springframework.validation.ObjectError; import org.springframework.web.bind.annotation.*; import javax.validation.Valid; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; @RestController @RequestMapping("/user") public class UserController { @PostMapping("/getUser") @ResponseBody public String getUser(@Valid @RequestBody User user, BindingResult result, Model model){ List allErrors = new ArrayList<>(); Map map = new HashMap(); // 如果有异常信息 System.out.println(result.hasErrors()+"|||"+result.getAllErrors().size()); System.out.println(user.toString()); if (result.hasErrors()) { result.getFieldErrors().forEach(error->{ String message = error.getDefaultMessage(); String field = error.getField(); map.put(field,message); }); } // 将异常信息输出 //model.addAttribute("msg", JSON.toJSONString(map)); System.out.println(JSON.toJSONString(map)); return JSON.toJSONString(map); } }
- 利用测试类生成JOSN数据,用Postman测试工具进行测试
public class TestDemo { @Test public void test01(){ User user = new User(); user.setUsername("admin"); user.setPwd("123"); user.setEmail("[email protected]"); String str = JSON.toJSONString(user); System.out.println(str.toString()); } }下一篇:SpringMVC-18-异常机制,