一、数据验证概述
1.1 客户端验证1.2 服务器端验证 二、Spring验证器
2.1 Validator接口2.2 ValidationUtils类2.3 代码演示
2.3.1 创建一个注册用户界面2.2.1 编写验证器类2.2.3 配置错误码错误信息2.2.4 在Spring MVC核心配置文件中配置消息属性文件2.2.5 创建注册请求2.2.6 验证 三、JSR 303 验证
用户的输入一般是随意的,为了保证数据的合法性,数据验证是所有Web应用必须处理的问题。
一、数据验证概述数据验证分为客户端验证和服务器端验证,客户端验证主要是过滤正常用户的误操作,通过Javascript代码完成;服务器端验证是是整个应用阻止非法数据的最后防线,通过在应用程序编程实现。
1.1 客户端验证在大多数情况下,使用Javascript进行客户端验证的步骤如下:
- 编写验证函数在提交表单的事件中调用验证函数。根据验证函数来判断是否进行表单提交
客户端验证是可以过滤用户的误操作,是第一道防线,一般使用Javascript代码实现。但仅有客户端验证是不够的,攻击者还可以绕过客户端验证直接进行非法输入,这样可能会引起系统异常,为了确保数据的合法性,防止用户通过非正常手段提交错误信息,必须加上服务器端验证。
1.2 服务器端验证 SpringMVC的Converter和Formatter在进行类型转换时是将输入数据转换成领域对象的属性值(一种Java类型),一旦成功,服务器端验证器就会介入。也就是说,在springMVC框架中先进行数据类型转换,再进行服务器端验证。
服务器端验证对于系统的安全性、完整性、健壮性起到了至关重要的作用。在SpringMVC框架中可以利用Spring自带的验证框架验证数据,也可以利用JSR 303 实现数据验证。
创建自定义Spring验证器需要实现org.springframework.validation.Validator接口,该接口有两个方法
当supports方法返回true时,验证器可以处理指定的Class。validate 方法的功能是验证目标对象object,并将验证错误消息存入Errors对象。
往Errors对象存入错误消息的方法是reject 或 rejectValue:
一般在配置文件中配置好错误码,reject 或 rejectValue方法中传入错误码,Spring MVC框架就会在消息属性文件中查找错误码,获取相应错误消息。
user.password.isnull为错误码,对应属性文件中配置错误信息
org.springframework.validation.ValidationUtils类是一个工具类,类中有帮助用户判断值是否为空的方法。
在给Errors对象存入错误消息:
//errors为错误对象实例,password表示需要判断是否为空的字段,user.password.isnul为错误码 ValidationUtils.rejectIfEmpty(errors,"password","user.password.isnull");2.3 代码演示 2.3.1 创建一个注册用户界面
需要使用JSTL 表单标签显示错误信息。
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<%--
Created by IntelliJ IDEA.
User: Administrator
Date: 2022/2/16
Time: 17:44
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
注册界面
注册界面
用户名:
密码:
<%--取出password字段错误信息--%>
2.2.1 编写验证器类
@Component
public class UserValidator implements Validator {
@Override
public boolean supports(Class> aClass) {
//要验证的model,返回值为false则不验证,isAssignableFrom:判断是否为某个类的父类
return User.class.isAssignableFrom(aClass);
}
@Override
public void validate(Object o, Errors errors) {
//o 要验证的对象
//ValidationUtils方式
ValidationUtils.rejectIfEmpty(errors,"name","user.name.isnull");
//errors.rejectValue
User user = (User) o;
if (user.getPassword() == null || user.getPassword().isEmpty()) {
errors.rejectValue("password","user.password.isnull");
}
}
}
2.2.3 配置错误码错误信息
创建errorMessages.properties文件,在文件中配置错误信息
user.name.isnull=name is null user.password.isnull=password is null2.2.4 在Spring MVC核心配置文件中配置消息属性文件
2.2.5 创建注册请求
@RequestMapping(value = "/toRegister1")
public String toMainForwardAndRedirect(User user, Model model, BindingResult result) {
//添加验证
this.userValidator.validate(user, result);
if (result.hasErrors()) {
//有错误
logger.info("注册失败");
return "register";
}else {
model.addAttribute("user", user);
logger.info("注册成功");
//注册成功到登录界面
return "login";
}
2.2.6 验证
三、JSR 303 验证
JSR 303 实现有Hibernate Validator 和 Apache BVal。



