一. SpringMVC 的数据验证
数据验证,包括 正常用户的误操作,和恶意用户的恶意操作两种。 验证,可以分为前端验证和后端验证。 前端验证主要是通过 JS来进行的,不安全。 后端验证,是通过服务器后端代码进行验证的。
SpringMVC 的验证,可以采用两种形式。
1 . SpringMVC 提供的validation校验框架 进行验证, 实现 validator 接口。
2 . 利用 JSR 303 (Java 验证规范) 来进行验证数据。 采用在Bean 属性上面添加注解的形式。
通常采用 JSR 303 的形式进行验证。
二. validation 校验框架进行验证
二.一 校验框架重要的接口和类
SpringMVC 在validation 校验框架中,提供了几个重要的接口 和类。 在 spring-context-4.2.4.RELEASE.jar 里面。
1 . org.springframework.validation.Validator 接口
package org.springframework.validation; public abstract interface Validator { public abstract boolean supports(Class<?> paramClass); public abstract void validate(Object paramObject, Errors paramErrors); }
有两个方法, supports() 验证能否对类 paramClass 进行校验。
validate() 方法,对目标类 paramObject 进行校验,校验后的数据存放到 paramErrors 中。
2 . org.springframework.validation.Errors 接口
用来存放错误信息的接口。 通过 reject()或者是rejectValue() 方法来进行添加错误信息。
有一个 BindingResult 接口扩展了该接口。 全称是: org.springframework.validation.BindingResult
3 . org.springframework.validation.ValidationUtils
提供了很多验证方法, 是一个验证字段属性是否存在错误的工具类。
主要有两个方法, rejectIfEmpty() 验证是否为空。 rejectIfEmptyOrWhitespace() 验证是否为空或者是空白字符串。
4 . org.springframework.validation.beanvalidation.LocalValidatorFactoryBean
将其定义到需要数据验证的Bean 中。 既实现了Spring 的validator 接口,也实现了 JSR303 的Validator 接口。
<mvc:annotation-driven></mvc:annotation-driven> 默认装载了 LocalValidatorFactoryBean,所以不需要手动显式实现。
二.二 Validator 验证数据的小例子(一)
这个,采用 @InitBinder 的方式,可以参考 第八章讲解 form:errors 标签时的例子。 去例子查看
(因为这一块不怎么重要,就不重复写代码了。 留下内容主要讲 JSR303)
二.二 Validator 验证数据的小例子(二)
这个,采用 注解的方式,进行注入进去。
1 . 后端, 创建UserValidator 验证器。 对用户名,密码,和年龄进行验证。
采用 @Repository 注解。
package com.yjl.validator; import org.springframework.stereotype.Repository; import org.springframework.validation.Errors; import org.springframework.validation.ValidationUtils; import org.springframework.validation.Validator; import com.yjl.pojo.User; @Repository(value="userValidator") public class UserValidator implements Validator{ @Override public boolean supports(Class<?> paramClass) { return User.class.isAssignableFrom(paramClass); } @Override public void validate(Object target, Errors errors) { //1. 验证不为空 ValidationUtils.rejectIfEmpty(errors,"name",null,"用户名不能为空"); ValidationUtils.rejectIfEmpty(errors,"password",null,"密码不能为空"); //2 .类型转换,进行更深入的验证。 User user=(User)target; if(user.getName()!=null&&!"".equals(user.getName())){ if(user.getName().length()>10){ errors.rejectValue("name",null,"用户名不能超过10个字符"); } } if(user.getPassword()!=null&&!"".equals(user.getPassword())){ if(user.getPassword().length()>15|| user.getPassword().length()<6){ errors.rejectValue("password",null,"密码长度在6~15之间"); } } if(user.getAge()!=null){ if(user.getAge()<18){ errors.rejectValue("age",null,"别装嫩噢"); } } } }
2 .UserAction 处理,进行验证。
@Autowired @Qualifier(value="userValidator") private UserValidator userValidator; //转到登录的页面 @RequestMapping(value="toLogin") public String toLogin(Model model){ model.addAttribute("user",new User()); return "user/login"; } //绑定到user对象。 @RequestMapping(value="login") public String login(@ModelAttribute User user,Model model,Errors errors){ model.addAttribute("user",user); //进行验证 userValidator.validate(user, errors); if(errors.hasFieldErrors()){ //有错的话,就返回登录页面。 return "user/login"; } return "user/list"; }
3 . springmvc.xml 配置文件中,要添加 com.yjl.validator 的扫描包。
<context:component-scan base-package="com.yjl.action,com.yjl.validator"></context:component-scan> <mvc:annotation-driven></mvc:annotation-driven>
4 . 前端页面代码
<body> <h2>两个蝴蝶飞,数据验证使用</h2> <form:form commandName="user" action="login.action" method="post"> <form:label path="name">姓名:</form:label> <form:input path="name"/> <form:errors path="name"></form:errors> <br/> <form:label path="password">密码:</form:label> <form:input path="password"/> <!--为了能看见值,这里用 form:input,而不是form:password --> <form:errors path="password"></form:errors> <br/> <form:label path="age">年龄:</form:label> <form:input path="age"/> <form:errors path="age"></form:errors> <br/> <form:button>提交</form:button> </form:form> </body>
5 . 重启服务器,进行相关的验证
对一些情况进行验证。
不输入用户名和密码时
密码长度不够时,用户名是正常的
用户名长度过多,年龄输入过小时,
这就是springmvc 的validation 验证框架的简单使用,功能很简单,所以需要看下面的JSR 303的验证。