数据验证

Posted mrchengs

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据验证相关的知识,希望对你有一定的参考价值。

 

用户输入一般书 随意的,为了保证数据的合法性,数据校验时所有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验证器可以百度查看相关的代码,这里不在陈述!!!!

 

以上是关于数据验证的主要内容,如果未能解决你的问题,请参考以下文章

教程4 - 验证和权限

21个常用代码片段

PHP 代码片段

JavaScript 有用的代码片段和 trick

任何更改后的 Android Firebase 数据库活动/片段正在关闭

ruby 我的博客文章“Rails中更好的条件验证”的片段