springMVC------服务器校验

时间:2019-03-19
本文章向大家介绍springMVC------服务器校验,主要包括springMVC------服务器校验使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

校验理解

项目中,通常使用较多的是前端的校验,比如页面中js校验。对于安全要求较高点建议在服务器进行校验。

服务器校验:

       控制层controller:校验页面请求的参数的合法性。在服务端控制层controller校验,不区分客户端类型(浏览器、手机客户端、远程调用)

       业务层service(使用较多):主要校验关键业务参数,仅限于service接口中使用的参数。

       持久层dao:一般是不校验的。

springMVC校验

Springmvc使用hibernate的校验框架validation(和hibernate没有任何关系)。

校验思路:

       页面提交申请参数,请求到controller方法中,使用validation进行校验。如果校验出错,将错误信息展示到页面。

具体需求:

       商品修改,添加校验(校验商品名称长度,生产日期的非空校验),如果校验出错,在商品修改页面显示错误信息。

环境准备

hibernate-validator-6.0.15.Final.jar

jboss-logging-3.3.2.Final.jar

validation-api-2.0.1.Final.jar

classmate-1.3.4.jar

配置校验器

<!-- 校验器 -->

    <bean id="validator"

    class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">

        <!-- hibernate校验器 -->

        <property name="providerClass" value="org.hibernate.validator.HibernateValidator"></property>

        <!-- 指定校验使用的资源文件,若不能指定,则默认使用classpath下的ValidationMessages.properties -->

        <property name="validationMessageSource" ref="messageSource"></property>

    </bean>

    <!-- 校验错误信息配置文件 -->

    <bean id="messageSource"

    class="org.springframework.context.support.ReloadableResourceBundleMessageSource">

        <!-- 资源文件名 -->

        <property name="basenames">

            <list>

                <value>classpath:CustomValidationMessages</value>

            </list>

        </property>

        <!-- 资源文件编码格式 -->

        <property name="defaultEncoding" value="UTF-8"></property>

        <!-- 对资源文件内容缓存时间,单位秒 -->

        <property name="cacheSeconds" value="120"></property>     

    </bean>

校验器注入到处理器适配器中

<mvc:annotation-driven conversion-service="conversionService" validator="validator">

</mvc:annotation-driven>

在pojo中添加校验规则

@Size(min=1,max=30,message="{items.name.lenght.error}")

private String name;

@NotNull(message="{items.createtime.isNull}");

private Date createtime;

CustomValidationMessages.properties

#输出校验信息

items.name.lenght.error=请输入1到30个字符的商品信息

items.createtime.isNull=请输入商品的生产日期

捕捉校验信息

// 根据id修改商品信息

    @RequestMapping("/editItemsSubmit")

    public String editItemsSubmit(Model model,HttpServletRequest request, Integer id,

            @Validated ItemsCustom itemsCustom,BindingResult bindingResult) throws Exception {

        //获取校验错误信息

       if(bindingResult.hasErrors()){

           //输出错误信息

           List<ObjectError> objectErrors=bindingResult.getAllErrors();

           for(ObjectError objectError:objectErrors){

              System.out.println(objectError.getDefaultMessage());

           }

           //将错误信息转到页面

           model.addAttribute("allErrors", objectErrors);

           //出错重回修改页面

           return "forward:selectByPrimaryKey.action";

       }

        itemsService.updateByPrimaryKeyWithBLOBs(id, itemsCustom);

        return "redirect:findItemsList.action";

    }

页面显示错误信息

<!-- 显示错误信息 -->

<c:if test="${allErrors!=null && allErrors.size()>0 }">

    <c:forEach items="${allErrors }" var="error">

        ${error.defaultMessage }<br/>

    </c:forEach>

</c:if>

分组校验

分组校验需求

在pojo中定义校验规则,而pojo是被多个controller所共用的,当不同的controller方法对同一个pojo进行校验,但是每个controller方法需要不同的校验。

解决方法:

定义多个校验分组(其实是一个java接口),分组中定义有哪些规则

每个controller方法使用不停的校验分组

校验分组

创建接口,其内容为空。

在校验规则中添加分组

@Size(min=1,max=30,message="{items.name.lenght.error}",groups={ValidGroup1.class})

private String name;

在controller方法使用指定分组的校验

// 根据id修改商品信息

@RequestMapping("/editItemsSubmit")

public String editItemsSubmit(Model model,HttpServletRequest request, Integer id,

        @Validated(value={ValidGroup1.class}) ItemsCustom itemsCustom,BindingResult bindingResult) throws Exception {

    … …

}