数据验证
用户输入一般书 随意的,为了保证数据的合法性,数据校验时所有web应用都必须处理的问题。
在spring MVC中有两种方法
1、利用spring自带的验证控件
2、JSR303
1、数据验证概述
数据验证分为客户端验证和服务的验证,客户端验证主要时过滤正常用户的误操作,
通过javascript代码完成;服务器端验证是整个应用阻止非法数据的最后防线。
1、客户端验证
在大多数情况下,使用JavaScript进行客户端验证步骤如下:
(1)、编写验证函数
(2)、在提交表单的事件中调用验证函数
(3)、根据验证函数来判断是否进行表单提交
客户端验证可以过滤用户误操作,是第一道防线,一般使用JavaScript
但是仅有客户端的验证时不够的,攻击者还可以通过绕过客户端直接进行非法输入
这可能会引起系统的异常,为了确保数据的合法性,必须要加上服务器端的检验
2、服务器端验证
Spring MVC的Converter和Formatter在进行类型转换时是将输入数据转换成领域对象的属性值(一种Java类型),
一旦成功,服务器端验证就会介入,也就是说,在spring MVC控件中先进行数据类型转换,在进行服务器端验证。
服务器端验证对于系统的安全性、完整性、健壮性起到了至关重要的作用。
本次测试介绍的是JSR303验证!!!
2、JSR303验证
对于JSR303验证,目前有两个实现,一个是Hibernate Validator,一个是Apache BVal
本次采用的是前者,只是做数据验证的功能
①、需要使用到的jar
②、验证测试
只是做最简单的测试展示
前端页面设计:
user.jsp
<body> <c:forEach items="${errors}" var="e"> <p style="color: red">${e.defaultMessage}</p> </c:forEach> <br> <form action="<%=request.getContextPath()%>/user" method="post"> 用户民:<input type="text" name="name"><br> 密码:<input type="password" name="pwd"><br> <input type="submit" value="submit"> </form> </body>
users.jsp
<body>
登陆成功!!
</body>
userController.java
package controller; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.validation.BindingResult; import org.springframework.validation.ObjectError; import org.springframework.web.bind.annotation.RequestMapping; import pojo.User; import javax.validation.Valid; import java.util.List; @Controller public class userController { @RequestMapping("/touser") public String toUser(){ return "user"; } @RequestMapping("/user") public String user(@Valid User user, BindingResult result, Model model){ System.out.println(user); List<ObjectError> error = result.getAllErrors(); if (error.size() > 0){ model.addAttribute("errors",error); return "user"; } return "users"; } }
注意:BindingResult必须紧随@Valid注解
测试基本的测试已经配置完成!!!
还需要对配置文件进行注册:
dispatcher-servlet.xml
<!--数据检验--> <bean class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean"></bean>
测试任务:
此时可以看出后台会对数据进行判断是否允许登陆!!!
③、标注类型
1、空检查
@Null:验证 对象是否位null
@NotNull:验证对象是否部位null,无法检验长度为0的字符串
@NotBlank:检查约束字符串是不是null,以及被trim后的长度是否大于0
只针对字符串,且会去掉前后空格
@NotEmpty:检查约束元素是否为null或者是empty
2、boolean检查
@AssertTrue:验证boolean属性是否为true
@AssertFalse:验证Boolean属性是否为false
3、长度检查
@Size(min=,max=):验证对象(Array、Colleaction、Map、String)长度
是否在给定的范围之内
@Length(min=,max=):验证字符串的长度是否再指定的范围之内
4、日期检查
@Past:验证Date和Calendar对象是否再当前时间之前
@Future:验证Date和Calendar对象是否再当前时间之后
@Pattern:验证String对象是否符合正则表达式的规则
5、数值检查
@Min:验证Number和String对象是否大于指定的值
@Max:验证Number和String对象是否小于指定的值
@DecimalMax:被标注的值必须不大于约束中指定的最大值,这个约束的参数是一
个通过BigDecimal定义的最大值字符串表示,小数存在精度。
@DecimalMin:被标注的值必须不小于约束中指定的最大值,这个约束的参数是一
个通过BigDecimal定义的最小值字符串表示,小数存在精度。
@Digits:验证Number和String的构成是否合法
@Digits(integer=,fraction=):验证字符串是否符合指定格式的数字,integer指定
整数精度,fraction指定小数精度
@Range(min=,max=):检查数字是否介于min和max之间
@Valid:对关联对象进行校验,如果关联对象是个集合或者数组,那么对其中到的元素进行校验
如果是一个map。则对其中的值部分进行校验
@Email:验证是否为邮件地址,如果为null,不进行验证,通过验证
数据校验基于Spring验证器可以百度查看相关的代码,这里不在陈述!!!!