前端校验后,为什么需要后端校验
在前面完成数据参数绑定到Controller时,我们可以在@RequestParam注解中做简单的空校验,就是设置required属性为true,以此来指定Controller方法中形参是否必须传入。数据校验是很常见的操作,有前端校验,即用户在前端页面上填写表单时,检查数据的合法性,再传入到后端。到了后端,还可以有后端的数据校验,后端校验通常是在业务逻辑方法,也就是我们的Controller方法里完成,例如在参数列表里使用注解完成数据校验。后端校验的原因是为了安全性考虑,防止别人通过接口乱调用后台的业务逻辑方法,假设在业务方法中不进行数据校验,有可能会被别让绕过前端校验,直接通过后端的接口方法调用,传入大量的脏数据到数据库。
在这篇日志中,总结自己使用集成Hibernate的校验框架, 和Spring MVC的Bean Validation数据校验。Bean Validation数据校验可以检查JavaBean中的数据,接下来先看看校验器的搭建。
配置validation校验器
validator声明和属性配置
上面说到,后端校验通常放在业务逻辑方法中,在Spring MVC里也就是我们的处理器适配器中具体实现方法,通过在形参列表中使用注解,完成数据校验。我的处理器映射器和适配器都是用注解的方式配置,即在Spring MVC的配置文件里使用的annotation-driven标签对,既然后端数据校验发生在处理器适配器中,当然校验器也要在annotation-driven标签里声明了:
<!-- 简写方式 配置注解的处理器映射器和适配器 -->
<!-- 添加名为"validator的校验器" -->
<mvc:annotation-driven validator="validator"></mvc:annotation-driven>
在annotation-driven标签中我们声明一个validator属性,指定了一个id为validator校验器。然后我们就继续在下面配置这个id为“validator”的校验器属性:
<!-- 配置校验器 -->
<bean id="validator"
class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
<property name="providerClass" value="org.hibernate.validator.HibernateValidator" />
<property name="validationMessageSource" ref="messageSource" />
</bean>
LocalValidatorFactoryBean是默认的校验器实现,下面配置的providerClass为继承的Hibernate校验框架,最后validationMessageSource表示的是校验使用的资源文件,里面可以自定义编写当校验出数据不合法时,给出的错误提示。如果不配置这个校验资源文件,会默认使用ValidationMessages.properties。
校验资源文件配置
当我们声明了校验资源文件后,就可以使用自己编写的文件实现自定义错误提示信息。首先在Spring MVC配置文件中配置这个资源文件:
<!-- 配置校验资源文件 -->
<bean id="messageSource"
class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
<property name="basenam