SpringMVC中的数据校验

SpringMVC中的数据校验

  这一篇博文主要总结一下springmvc中对数据的校验。在实际中,通常使用较多是前端的校验,比如页面中js校验,对于安全要求较高的建议在服务端也要进行校验。服务端校验可以是在控制层conroller,也可以是在业务层service,controller校验页面请求的参数的合法性,在服务端控制层conroller的校验,不区分客户端类型(浏览器、手机客户端、远程调用);service层主要校验关键业务参数,仅限于service接口中使用的参数。这里主要总结一下何如使用springmvc中controller的校验。

1. 环境准备

  springmvc中我们使用hibernate的校验框架validation(注:和hibernate没有任何关系),使用这个校验框架的话,需要导入jar包(下载地址),如下:

2. 配置校验器

  在springmvc.xml配置文件中配置一下校验器,如下:

<!-- 配置校验器 -->
<bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
    <!-- 校验器,使用hibernate校验器 -->
    <property name="providerClass" value="org.hibernate.validator.HibernateValidator"/>
    <!-- 指定校验使用的资源文件,在文件中配置校验错误信息,如果不指定则默认使用classpath下面的ValidationMessages.properties文件 -->
    <property name="validationMessageSource" ref="messageSource"/>
</bean>
<!-- 校验错误信息配置文件 -->
<bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
    <!-- 资源文件名 -->
    <property name="basenames">
        <list>
            <value>classpath:CustomValidationMessage</value>
        </list>
    </property>
    <!-- 资源文件编码格式 -->
    <property name="fileEncodings" value="utf-8"/>
    <!-- 对资源文件内容缓存时间,单位秒 -->
    <property name="cacheSeconds" value="120"/>
</bean>

  配置规则就是bean和property属性,别把class和文件名写错了就行,这里有个配置是资源文件名,这个文件中我们将会配置一些错误信息。配置好了校验器后,需要将校验器注入到处理器适配器中,还是在springmvc.xml文件中,将我们配好的validator注入进去,如下: 
 
  这样校验器就配置好了。

3. pojo中添加校验

  hibernate校验框架提供了很多注解校验,我先简单罗列一下:


注解


运行时检查


@AssertFalse


被注解的元素必须为false


@AssertTrue


被注解的元素必须为true


@DecimalMax(value)


被注解的元素必须为一个数字,其值必须小于等于指定的最小值


@DecimalMin(Value)


被注解的元素必须为一个数字,其值必须大于等于指定的最小值


@Digits(integer=,
fraction=)


被注解的元素必须为一个数字,其值必须在可接受的范围内


@Future


被注解的元素必须是日期,检查给定的日期是否比现在晚


@Max(value)


被注解的元素必须为一个数字,其值必须小于等于指定的最小值


@Min(value)


被注解的元素必须为一个数字,其值必须大于等于指定的最小值


@NotNull


被注解的元素必须不为null


@Null


被注解的元素必须为null


@Past(java.util.Date/Calendar)


被注解的元素必须过去的日期,检查标注对象中的值表示的日期比当前早


@Pattern(regex=,
flag=)


被注解的元素必须符合正则表达式,检查该字符串是否能够在match指定的情况下被regex定义的正则表达式匹配


@Size(min=, max=)


被注解的元素必须在制定的范围(数据类型:String,
Collection, Map and arrays)


@Valid


递归的对关联对象进行校验, 如果关联对象是个集合或者数组, 那么对其中的元素进行递归校验,如果是一个map,则对其中的值部分进行校验


@CreditCardNumber


对信用卡号进行一个大致的验证


@Email


被注释的元素必须是电子邮箱地址


@Length(min=,
max=)


被注解的对象必须是字符串的大小必须在制定的范围内


@NotBlank


被注解的对象必须为字符串,不能为空,检查时会将空格忽略


@NotEmpty


被注释的对象必须为空(数据:String,Collection,Map,arrays)


@Range(min=, max=)


被注释的元素必须在合适的范围内 (数据:BigDecimal,
BigInteger, String, byte, short, int, long and 原始类型的包装类 )


@URL(protocol=,
host=, port=, regexp=, flags=)


被注解的对象必须是字符串,检查是否是一个有效的URL,如果提供了protocol,host等,则该URL还需满足提供的条件

  上面我简单罗列了一些校验的注解,不同的注解的具体使用方法可以参考官方文档或者网上资料,这里我选择两个注解来说明如何使用这个hibernate验证框架。首先在自己的pojo中需要验证的属性上添加相应的验证注解: 
 
  我们看到注解中可以指定message,那么这个message中的内容是错误消息配置文件中对应的key,取出来的就是对应的错误消息,所以针对这两个错误消息,我们写一下配置文件:

4. 捕获校验错误信息

  上面已经将校验相关的配置都配好了,接下来就需要在controller的方法中捕获校验结果中的错误信息,然后将这些错误信息传到前台去显示。那么controller的方法中该如何去捕获呢?如下:

  可以看出,在需要校验的pojo前边添加@Validated,在需要校验的pojo后边添加BindingResult bindingResult来接收校验出错信息。值得注意的是:@Validated和BindingResult bindingResult是配对出现,并且形参顺序是固定的(一前一后)。这样就可以顺利接收到错误信息了。关于前台的东西,我就不写了。

5. 分组校验

  上面已经能完成springmvc的校验功能了,但是有个问题:刚刚是在pojo中定义了校验规则,但是pojo是被多个controller使用的,现在假如两个不同的controller使用的校验规则是不一样的,简单来说,一个controller不需要去校验生产日期,只要校验一下商品名称即可,另一个controller两个都要校验,这样就没法做了,因为两个controller都使用同一个pojo。 
  为了解决这个问题,我们可以定义多个校验分组(其实是一个java接口),分组中定义有哪些规则,每个controller方法使用不同的校验分组即可。看一下下面的例子就明白了: 
  首先定义一个校验分组:

public interface ValidGroup1 {
 
    //接口中不需要定义任何方法,仅仅是对不同的校验规则进行分组
    //此分组只校验商品名称的长度
 
}

  然后我们在刚刚的pojo中,添加这个分组,如下:

  再看一下想要校验这个name字段的controller中是如何配置的:

  这样该controller就不会去校验生产日期的字段了,通过这种方式可以解决不同的controller校验不同字段的问题。

原文地址:https://www.cnblogs.com/wangchaonan/p/10731405.html

时间: 2024-08-24 21:48:31

SpringMVC中的数据校验的相关文章

【SpringMVC学习06】SpringMVC中的数据校验

这一篇博文主要总结一下springmvc中对数据的校验.在实际中,通常使用较多是前端的校验,比如页面中js校验,对于安全要求较高的建议在服务端也要进行校验.服务端校验可以是在控制层conroller,也可以是在业务层service,controller校验页面请求的参数的合法性,在服务端控制层conroller的校验,不区分客户端类型(浏览器.手机客户端.远程调用):service层主要校验关键业务参数,仅限于service接口中使用的参数.这里主要总结一下何如使用springmvc中contr

在SpringMVC中使用数据验证组件——hibernate-validator

在做web开发的时候,经常需要对客户端发送过来的数据进行一个验证,以防数据不合法.而SpringMVC支持的数据校验是JSR303的标准,通过在bean的属性上打上annotation @NotNull @Max等注解进行验证.JSR303提供有很多annotation借口,而SpringMVC对于这些验证是使用hibernate的实现,所以我们需要添加hibernate的一个validator包: <dependency> <groupId>org.hibernate</g

struts2中服务器端数据校验

数据校验指对数据合法性进行检查,根据验证数据的位置可以分为客户端验证和服务器端验证,今天随笔主要写的是实现服务器端的数据验证,服务器端数据验证主要特点: ·数据提交后在服务器端验证 ·防止绕过客户端验证提交的非法数据 ·可以在服务器端处理数据前保证数据的合法性 Struts2中有两种实现服务器端验证的方式. 一.       使用ActionSupport编码实现验证 在Action类的方法中直接验证 在Action 类中直接进行校验是一种最为原始的方法,这里作为了解,首先是action 类中的

springmvc中的数据传递

import javax.servlet.http.HttpServletRequest; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.servlet.ModelAndView; @

jst获取不到springmvc中model数据

才发现犯了一个平时不会注意的错误 我是用maven自动生成的web.xml文件 如下: <!DOCTYPE web-app PUBLIC"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN""http://java.sun.com/dtd/web-app_2_3.dtd" > <web-app> </web-app> 但这样的文件不行,需要改成 <?xml versi

SpringMVC-------3.文件上传,拦截器和数据校验(后台校验)

1.文件上传 1.1导入jar包 1.2设置表单提交属性 文件上传只允许表单为post提交,并且编码类型为multipart/form-data 1.3在springmvc中配置文件上传解析器. 其中的id名不能更改,否则报错 设置最大上传大小maxUploadSize 1.4 在控制层处理代码 @RequestMapping("upload") public String upload(MultipartFile myfile,HttpServletRequest request)

在Spring中使用数据验证组件hibernate-validator

在做web开发的时候,经常需要对客户端发送过来的数据进行一个验证,以防数据不合法. 而SpringMVC支持的数据校验是JSR303的标准,通过在bean的属性上打上annotation @NotNull @Max等注解进行验证.JSR303提供有很多annotation借口,而SpringMVC对于这些验证是使用hibernate的实现,所以我们需要添加hibernate的一个validator包: 在SpringMVC中引入 <dependency> <groupId>org.

使用Struts2实现数据校验

为什么需要数据校验呢?答案很简单,假如当你登录想要京东,这时就需要数据校验了如果不输入用户名的话,那么就不会登陆成功,并且会提示出"请输入用户名"的字样 那么,在Struts2中实现数据校验的方法有哪些呢?接下来我们探讨一下. 实现数据校验有四种方法: 1.用execute()方法实现数据校验 编写一个Action,继承ActionSupport类,重写execute() 步骤1:在Web项目的cn.happy.action下创建一个ExecuteAction(UserInfo为用户实

springMVC中参数格式化

SpringMVC中的数据编辑器主要用于在数据传递过程中的数据类型转化,例如:我们的前端有一个"2015-04-28"的日期格式的字符串,我们在将其传递时,直接转化为我们所需要的Date类型,这是后就需要属性编辑器. 在这里我们仍然使用日期类型转换为例: 需要导入包:joda-time-2.1.jar index.jsp <form action="date" method="post"> date:<input type=&q