对于前端页面的输入校验分为客户端校验和服务器端校验。客户端校验主要是过滤正常用户的误操作,通常通过 JavaScript 代码完成。服务器端校验是整个应用阻止非法数据的最后防线,主要通过在应用中编码实现。
SpringMVC 提供了两种方式来验证输入:
- 一种是 Spring 自带的 Validation 校验框架。
- 另一种是利用 JSR 303(Java验证规范) 实现校验功能。
Spring 的 Validation 校验框架
Spring 拥有自己的独立数据校验框架,在进行数据绑定时,可以同时调用校验框架来完成数据校验工作。Spring 的校验框架在 org.springframework.validation 包中,其中重要的接口和类如下:
- Valiator:最重要的接口。包含两个方法:
- boolean supports(Class<?> clazz) :该校验器能够对 clazz 类型的对象进行校验。
- void validate(Object target,Errors errors):对目标类 target 进行校验,并将校验错误记录在 errors 当中。
- Errors:Spring 用来存放错误信息的接口。SpringMVC 在把请求数据绑定到入参对象后,就会调用校验框架实施校验,而校验结果保存在处理方法的参数对象 Errors 或者 BindingResult 中。一个 Errors 对象包含了一系列的 FieldError 和 ObjectError 对象。FieldError 表示与被校验的对象中的某个属性相关的一个错误;BindingResult 扩展自 Errors 接口,可以获取数据绑定结果对象的信息。
- ValidationUtils:Spring 提供的一个关于校验的工具类。它提供了多个给 Errors 对象保持错误的方法。
- LocalValidatorFactoryBean:位于 org.springframework.validation.beanvalidation 包中,该类既实现了 Spring 的 Validator 接口,也实现了 JSR303 的 Validator 接口,只要在 Spring 容器中定义一个 LocalValidatorFactoryBean,即可将其注入到需要数据校验的 Bean 中。
<mvc:annotation-driven/>
默认装配好一个 LocalValidatorFactoryBean,但如果需要 JSR303 验证,则需要引入其实现类。
JSR303 校验
JSR303 是 Java 为 Bean 数据合法性校验所提供的一个标准规范,叫做 Bean Valiadation。
Bean Validation 为 JavaBean 验证定义了相应的元数据类型和 API。在应用程序中,通过在 Bean 属性上标注类似于 @NotNull、@Max 等标准的注解指定校验规则,并通过标注的验证接口对 Bean 进行验证。Bean Validation 是一个运行时的数据验证框架,在验证之后验证的错误信息会被马上返回。
JSR303 是一个规范,它的核心接口是 javax.validation.Validator,该接口根据目标对象类中所标注的校验注解进行数据校验,并得到校验结果。JSR 303 目前有两个实现,第一个实现是 Hibernate Validator,第二个实现是 Apache bval。
JSR 303 中定义了一套可标注在成员变量、属性方法上的校验注解:
Hibernate Valiadator 是 JSR 303 的一个参考实现,处理支持所有标准的校验注解之外,它还扩展了注解: