数据校验
在web应用程序中,为了防止客户端传来的数据引发程序异常,常常需要对 数据进行验证。输入验证分为客户端验证与服务器端验证。客户端验证主要通过JavaScript脚本进行,而服务器端验证则主要通过Java代码进行验证。 为了保证数据的安全性,一般情况下,客户端和服务器端验证都是必须的
在 Spring MVC 框架中有以下两种方法可以验证输入数据:
- 利用 Spring 自带的验证框架。
- 利用 JSR 303 实现。
这里使用JSR303验证:
对于 JSR 303 验证,目前有两个实现,一个是 Hibernate Validator,一个是 Apache BVal。这里采用的是 Hibernate Validator,注意它和 Hibernate 无关,只是使用它进行数据验证。
下载 Hibernate Validator
用户可以通过地址“https://sourceforge.net/projects/hibernate/files/hibernate-validator/”下载 Hibernate Validator
关键步骤
导入jar包
在SpringMVC.xml中配置验证器并注册注解驱动
定义实体类,打注解标记
public class User {
//@NotEmpty一般用在字符串,判断内容非空
//message:验证不通过时的错误提示信息
@NotEmpty(message = "用户名不能为空")
//@Size验证字符串长度
@Size(min = 3,max = 6,message="用户名只能是3到6位")
private String account;
@NotEmpty(message="密码不能为空")
@Size(min = 3,max = 6,message="密码只能是3到6位")
private String password;
@NotNull(message="年龄不能为空")//@NotNull判断引用类型非空
@Min(value = 18,message="年龄不能小于18岁")//最小值
@Max(value=100,message="年龄不能大于100岁")//最大值
private Integer age;
//指定日期格式
@DateTimeFormat(pattern = "^\\d{4}-\\d{2}-\\d{2}$")
private Date birthday;
@NotEmpty(message="邮箱不能为空")
@Email(message="邮箱格式不正确")//@Email邮箱格式验证
private String email;
}
controller中的方法
@Controller
public class UserController {
@RequestMapping("/test.do")
public ModelAndView test01(@Validated User user,BindingResult br) {
ModelAndView mv = new ModelAndView();
//获取未通过的总条数
int errorCount = br.getErrorCount();
if(errorCount>0) {
//获取错误对象
FieldError fieldAccError = br.getFieldError("account");
//判断是否有错误信息
if(fieldAccError!=null) {
//fieldAccError.getDefaultMessage()获取对应的错误信息提示
mv.addObject("account", fieldAccError.getDefaultMessage());
}
FieldError fieldPassError = br.getFieldError("password");
if(fieldPassError!=null) {
mv.addObject("password", fieldPassError.getDefaultMessage());
}
FieldError fieldAgeError = br.getFieldError("age");
if(fieldAgeError!=null) {
mv.addObject("age", fieldAgeError.getDefaultMessage());
}
FieldError fieldBirError = br.getFieldError("birthday");
if(fieldBirError!=null) {
mv.addObject("birthday", fieldBirError.getDefaultMessage());
}
FieldError fieldEmailError = br.getFieldError("email");
if(fieldEmailError!=null) {
mv.addObject("email", fieldEmailError.getDefaultMessage());
}
mv.setViewName("/jsp/index.jsp");
return mv;
}
mv.setViewName("/jsp/index.jsp");
System.out.println("验证通过");
return mv;
}
}
常用注解检查
1)空检查
- @Null:验证对象是否为 null。
- @NotNull:验证对象是否不为 null,无法检查长度为 0 的字符串。
- @NotBlank:检查约束字符串是不是 null,以及被 trim 后的长度是否大于 0,只针对字符串,且会去掉前后空格。
- @NotEmpty:检查约束元素是否为 null 或者是 empty。
如:
@NotEmpty(message="密码不能为空")
private String password;
2)boolean 检查
- @AssertTrue:验证 boolean 属性是否为 true。
- @AssertFalse:验证 boolean 属性是否为 false。
如:
@AssertTrue
private boolean isLogin;
3)长度检查
- @Size(min=,max=):验证对象(Array、Collection、Map、String)长度是否在给定的范围之内。
- @Length(min=,max=):验证字符串长度是否在给定的范围之内。
如:
@Size(min = 3,max = 6,message="用户名只能是3到6位")
private String account;
4)日期检查
- @Past:验证 Date 和 Callendar 对象是否在当前时间之前。
- @Future:验证 Date 和 Calendar 对象是否在当前时间之后。
- @Pattern:验证 String 对象是否符合正则表达式的规则。
如:
//指定日期格式
@DateTimeFormat(pattern = "^\\d{4}-\\d{2}-\\d{2}$")
private Date birthday;
5)数值检查
名称 | 说明 |
---|---|
@Min | 验证 Number 和 String 对象是否大于指定的值 |
@Max | 验证 Number 和 String 对象是否小于指定的值 |
@DecimalMax | 被标注的值必须不大于约束中指定的最大值,这个约束的参数是一个通过 BigDecimal 定义的最大值的字符串表示,小数存在精度 |
@DecimalMin | 被标注的值必须不小于约束中指定的最小值,这个约束的参数是一个通过 BigDecimal 定义的最小值的字符串表示,小数存在精度 |
@Digits | 验证 Number 和 String 的构成是否合法 |
@Digits(integer=,fraction=) | 验证字符串是否符合指定格式的数字,integer 指定整数精度,fraction 指定小数精度 |
@Range(min=,max=) | 检查数字是否介于 min 和 max 之间 |
@Valid | 对关联对象进行校验,如果关联对象是个集合或者数组,那么对其中的元素进行校验,如果是一个 map,则对其中的值部分进行校验 |
@CreditCardNumber | 信用卡验证 |
| 对关联对象进行校验,如果关联对象是个集合或者数组,那么对其中的元素进行校验,如果是一个 map,则对其中的值部分进行校验 |
| @CreditCardNumber | 信用卡验证 |
| @Email | 验证是否为邮件地址,如果为 null,不进行验证,通过验证 |