用户的输入一般是随意的,为了保证数据的合法性,数据验证是所有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对象存入错误消息:
//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" %>
<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