springMVC如何对输入数据校验实现代码

前言

数据的校验是交互式网站一个不可或缺的功能,数据验证分为客户端验证和服务器端验证。前端的js校验可以涵盖大部分的校验职责,如用户名唯一性,生日格式,邮箱格式校验等等常用的校验;但是为了避免用户绕过浏览器,使用http工具直接向后端请求一些违法数据,服务端的数据校验也是必要的,可以防止脏数据落到数据库中,如果数据库中出现一个非法的邮箱格式,也会让运维人员头疼不已,服务器端验证是整个应用阻止非法数据的最后防线,通过在应用中编程实现。
客户端验证在大多数情况下,使用 JavaScript 进行客户端验证的步骤如下:

  • 编写验证函数。
  • 在提交表单的事件中调用验证函数。
  • 根据验证函数来判断是否进行表单提交。

服务器端验证对于系统的安全性、完整性、健壮性起到了至关重要的作用。服务器端验证Spring MVC 的 Converter 和 Formatter 在进行类型转换时是将输入数据转换成领域对象的属性值(一种 Java 类型),一旦成功,服务器端验证器就会介入。也就是说,在 Spring MVC 框架中先进行数据类型转换,再进行服务器端验证。在 Spring MVC 框架中可以利用 Spring 自带的验证框架验证数据,也可以利用 JSR 303 实现数据验证。

JSR303/JSR-349,hibernate validation,spring validation之间的关系

JSR303是一项标准,JSR-349是其的升级版本,添加了一些新特性,他们规定一些校验规范即校验注解,如@Null,@NotNull,@Pattern,他们位于javax.validation.constraints包下,只提供规范不提供实现。而hibernate validation是对这个规范的实践(不要将hibernate和数据库orm框架联系在一起),他提供了相应的实现,并增加了一些其他校验注解,如@Email,@Length,@Range等等,他们位于org.hibernate.validator.constraints包下。而万能的spring为了给开发者提供便捷,对hibernate validation进行了二次封装,显示校验validated bean时,你可以使用spring validation或者hibernate validation,而spring validation另一个特性,便是其在springmvc模块中添加了自动校验,并将校验信息封装进了特定的类中。这无疑便捷了我们的web开发。本文主要介绍在springmvc中自动校验的机制。

springMVC输入数据校验实现

首先在maven项目中引入相关jar包

<!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-validator -->
<dependency>
 <groupId>org.hibernate.validator</groupId>
 <artifactId>hibernate-validator</artifactId>
 <version>6.0.13.Final</version>
</dependency>
<dependency>
 <groupId>javax.validation</groupId>
 <artifactId>validation-api</artifactId>
 <version>2.0.1.Final</version>
</dependency>
<dependency>
 <groupId>javax.el</groupId>
 <artifactId>javax.el-api</artifactId>
 <version>3.0.0</version>
</dependency>

开启spring的Valid功能

<mvc:annotation-driven />

创建需要被校验的实体类

import org.hibernate.validator.constraints.Length;
import javax.validation.constraints.Email;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Pattern;

//与数据库中users对应
public class UserInfo {
  private int id;
  @Pattern(regexp = Constants.USERNAMR, message = Constants.USERNAMRERROR)
  private String username;
  @NotBlank(message = Constants.NAMEERROR)
  private String name;
  @Email(message = Constants.EMAILERROR)
  private String email;
  @Length(min = 6, max = 16, message = Constants.PASSWORDERROR)
  private String password;
  @Pattern(regexp = Constants.PHONE, message = Constants.PHONEERROR)
  private String phoneNum;
  //...get/set方法
}

这些注解还是比较浅显易懂的,字段上的注解名称即可推断出校验内容,每一个注解都包含了message字段,用于校验失败时作为提示信息,特殊的校验注解,如Pattern(正则校验),还可以自己添加正则表达式。

JSR提供的校验注解:     
@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(regex=,flag=) 被注释的元素必须符合指定的正则表达式  


Hibernate Validator提供的校验注解: 
@NotBlank(message =)  验证字符串非null,且长度必须大于0  
@Email 被注释的元素必须是电子邮箱地址  
@Length(min=,max=) 被注释的字符串的大小必须在指定的范围内  
@NotEmpty  被注释的字符串的必须非空  
@Range(min=,max=,message=) 被注释的元素必须在合适的范围内

springMVC如何对输入数据校验实现代码

扫一扫手机访问