用户的输入一般是随意的,为了保证数据的合法性,数据验证是所有Web应用必须处理的问题。
一、数据验证概述
????????数据验证分为客户端验证和服务器端验证,客户端验证主要是过滤正常用户的误操作,通过JavaScript代码完成;服务器端验证是是整个应用阻止非法数据的最后防线,通过在应用程序编程实现。
1.1 客户端验证
在大多数情况下,使用JavaScript进行客户端验证的步骤如下:
- 编写验证函数
- 在提交表单的事件中调用验证函数。
- 根据验证函数来判断是否进行表单提交
????????客户端验证是可以过滤用户的误操作,是第一道防线,一般使用JavaScript代码实现。但仅有客户端验证是不够的,攻击者还可以绕过客户端验证直接进行非法输入,这样可能会引起系统异常,为了确保数据的合法性,防止用户通过非正常手段提交错误信息,必须加上服务器端验证。
1.2 服务器端验证
????????SpringMVC的Converter和Formatter在进行类型转换时是将输入数据转换成领域对象的属性值(一种Java类型),一旦成功,服务器端验证器就会介入。也就是说,在springMVC框架中先进行数据类型转换,再进行服务器端验证。 服务器端验证对于系统的安全性、完整性、健壮性起到了至关重要的作用。在SpringMVC框架中可以利用Spring自带的验证框架验证数据,也可以利用JSR 303 实现数据验证。
二、Spring验证器
2.1 Validator接口
创建自定义Spring验证器需要实现org.springframework.validation.Validator接口,该接口有两个方法
- 当supports方法返回true时,验证器可以处理指定的Class。
- validate 方法的功能是验证目标对象object,并将验证错误消息存入Errors对象。
往Errors对象存入错误消息的方法是reject 或 rejectValue: 一般在配置文件中配置好错误码,reject 或 rejectValue方法中传入错误码,Spring MVC框架就会在消息属性文件中查找错误码,获取相应错误消息。
user.password.isnull为错误码,对应属性文件中配置错误信息
2.2 ValidationUtils类
org.springframework.validation.ValidationUtils类是一个工具类,类中有帮助用户判断值是否为空的方法。
在给Errors对象存入错误消息:
ValidationUtils.rejectIfEmpty(errors,"password","user.password.isnull");
2.3 代码演示
2.3.1 创建一个注册用户界面
<%@ 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" %>
<html>
<head>
<title>注册界面</title>
</head>
<body>
<form:form modelAttribute="user" action="${pageContext.request.contextPath}/index/toRegister1" method="post">
<p>注册界面</p>
<table>
<tr>
<td>用户名: <input type="text" name="name" placeholder="请输入用户名"/> </td>
<td> 密码:<input type="password" name="password" placeholder="请输入密码"/> </td>
</tr>
<tr>
<td colspan="2"> <input type="submit" value="注册"> </td>
</tr>
</table>
<%--取出password字段错误信息--%>
<form:errors path="password"/>
</form:form>
</body>
</html>
2.2.1 编写验证器类
@Component
public class UserValidator implements Validator {
@Override
public boolean supports(Class<?> aClass) {
return User.class.isAssignableFrom(aClass);
}
@Override
public void validate(Object o, Errors errors) {
ValidationUtils.rejectIfEmpty(errors,"name","user.name.isnull");
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 null
2.2.4 在Spring MVC核心配置文件中配置消息属性文件
<bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
<property name="basename" value="/WEB-INF/resource/errorMessages"/>
</bean>
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。
|