1. 程式人生 > >springmvc 使用JSR-303進行資料校驗

springmvc 使用JSR-303進行資料校驗

專案中,通常使用較多的是前端的校驗,比如頁面中js校驗以及form表單使用bootstrap校驗。然而對於安全要求較高點建議在服務端進行校驗。

服務端校驗:

  1. 控制層controller:校驗頁面請求的引數的合法性。在服務端控制層controller校驗,不區分客戶端型別。
  2. 業務層service(使用較多):主要校驗關鍵業務引數,僅限於service介面中使用的引數。
  3. 持久層dao:一般是不校驗的。

環境整合

1、新增jar包:
此處使用Hibernate-validator實現(版本:hibernate-validator-4.3.0.Final-dist.zip),將如下jar包新增到classpath(WEB-INF/lib下即可):
dist/lib/required/validation-api-1.0.0.GA.jar JSR-303規範API包
dist/hibernate-validator-4.3.0.Final.jar Hibernate 參考實現

2、在Spring配置總新增對JSR-303驗證框架的支援

<!-- 校驗錯誤資訊配置檔案 -->
    <bean id="messageSource"
        class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
        <!-- 資原始檔名-->
        <property name="basenames">   
         <list>    
            <value
>
classpath:CustomValidationMessages</value> </list> </property> <!-- 資原始檔編碼格式 --> <property name="fileEncodings" value="utf-8" /> <!-- 對資原始檔內容快取時間,單位秒 --> <property name="cacheSeconds" value="120" /> </bean
>
<!-- 校驗器 -->
    <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>

自動註冊validator

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

例子說明

例子一:

import javax.validation.constraints.NotNull;  
public class UserModel {  
    @NotNull(message="{username.not.empty}")  
    private String username;  
}  

通過@NotNull指定此username欄位不允許為空,當驗證失敗時將從之前指定的messageSource中獲取“username.not.empty”對於的錯誤資訊,此處只有通過“{錯誤訊息鍵值}”格式指定的才能從messageSource獲取。

@Controller  
public class HelloWorldController {  
    @RequestMapping("/validate/hello")  
    public String validate(@Valid @ModelAttribute("user") UserModel user, Errors errors) {  

        if(errors.hasErrors()) {  
            return "validate/error";  
        }  
        return "redirect:/success";  
    }  
} 

通過在命令物件上註解@Valid來告訴Spring MVC此命令物件在繫結完畢後需要進行JSR-303驗證,如果驗證失敗會將錯誤資訊新增到errors錯誤物件中。

驗證失敗後需要展示的頁面(/WEB-INF/jsp/error.jsp)

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>  
<%@taglib prefix="form" uri="http://www.springframework.org/tags/form" %>  

<form:form commandName="user">  
    <form:errors path="*" cssStyle="color:red"></form:errors><br/>  
</form:form>  

在瀏覽器位址列中輸入http://localhost:8080/validate/hello,即沒有username資料,請求後將直接到驗證失敗介面並顯示錯誤訊息“使用者名稱不能為空”,如果請求時帶上“?username=zhang”將重定向到成功頁面。

例子二:

public class Items {
    private Integer id;
    @Size(min=1,max=20,message="{items.name.length.error}")
    private String name;

    @NotNull(message="{items.createtime.isNULL}")
    private Date createtime;

    省略set()和get()...
}
public String editItemsSubmit(Model model,  @Validated Items items, 
BindingResult bindingResult) throws Exception {
        if(bindingResult.hasErrors()){
            List<ObjectError> allErrors = bindingResult.getAllErrors();
            for(ObjectError objectError:allErrors) {
        System.out.println(objectError.getDefaultMessage());
            }

            //可以直接使用model將提交pojo回顯到頁面
            model.addAttribute("items",items);

            // 出錯重新到商品修改頁面
            return "items/editItems";
        }
        return "success";
    }
<table width="100%" border=1>
<tr>
    <td>商品名稱</td>
    <td><form:input type="text" path="items.name" value="${items.name }"/></td><form:errors path="items.name"/>
</tr>
<tr>
    <td>商品生產日期</td>
    <td><input type="text" name="createtime" value="<fmt:formatDate value="${items.createtime}" pattern="yyyy-MM-dd HH:mm:ss"/>"/></td>
</tr>

然後jsp頁面還是之前的頁面,並能顯示輸入不合法的並通過<form:errors path="items.name"/>顯示出來,這樣明顯更加簡單。

當我們配置了messageSource Bean時,預設將為驗證的物件自動生成如下錯誤訊息鍵:
驗證錯誤註解簡單類名.驗證物件名.欄位名
驗證錯誤註解簡單類名.欄位名
驗證錯誤註解簡單類名.欄位型別全限定類名
驗證錯誤註解簡單類名

使用的優先順序是:從高到低,即最前邊的具有最高的優先順序,而且以上所有預設的錯誤訊息鍵優先順序高於自定義的錯誤訊息鍵。

如測試用例
public String pattern(@Valid @ModelAttribute(“model”) PatternModel model, Errors errors)
將自動產生如下錯誤訊息鍵:
Pattern.model.value=驗證錯誤註解簡單類名.驗證物件名.欄位名
Pattern.value=驗證錯誤註解簡單類名.欄位名
Pattern.java.lang.String=驗證錯誤註解簡單類名.欄位型別全限定類名
Pattern=驗證錯誤註解簡單類名

內建的驗證約束註解如下表所示(摘自hibernate validator reference):

驗證註解 驗證的資料型別 說明
@AssertFalse Boolean,boolean 驗證註解的元素值是false
@AssertTrue Boolean,boolean 驗證註解的元素值是true
@NotNull 任意型別 驗證註解的元素值不是null
@Null 任意型別 驗證註解的元素值是null
@Min(value=值) BigDecimal,BigInteger, byte, short, int, long,等任何Number或CharSequence(儲存的是數字)子型別 驗證註解的元素值大於等於@Min指定的value值
@Max(value=值) 和@Min要求一樣 驗證註解的元素值小於等於@Max指定的value值
@DecimalMin(value=值) 和@Min要求一樣 驗證註解的元素值大於等於@ DecimalMin指定的value值
@DecimalMax(value=值) 和@Min要求一樣 驗證註解的元素值小於等於@ DecimalMax指定的value值
@Digits(integer=整數位數, fraction=小數位數) 和@Min要求一樣 驗證註解的元素值的整數位數和小數位數上限
@Size(min=下限, max=上限) 字串、Collection、Map、陣列等 驗證註解的元素值的在min和max(包含)指定區間之內,如字元長度、集合大小
@Past java.util.Date, java.util.Calendar; Joda Time類庫的日期型別 驗證註解的元素值(日期型別)比當前時間早
@Future 與@Past要求一樣 驗證註解的元素值(日期型別)比當前時間晚
@NotBlank CharSequence子型別 驗證註解的元素值不為空(不為null、去除首位空格後長度為0),不同於@NotEmpty,@NotBlank只應用於字串且在比較時會去除字串的首位空格
@Length(min=下限, max=上限) CharSequence子型別 驗證註解的元素值長度在min和max區間內
@NotEmpty CharSequence子型別、Collection、Map、陣列 驗證註解的元素值不為null且不為空(字串長度不為0、集合大小不為0)
@Range(min=最小值, max=最大值) BigDecimal,BigInteger,CharSequence, byte, short, int, long等原子型別和包裝型別 驗證註解的元素值在最小值和最大值之間
@Email(regexp=正則表示式,flag=標誌的模式) CharSequence子型別(如String) 驗證註解的元素值是Email,也可以通過regexp和flag指定自定義的email格式
@Pattern(regexp=正則表示式,flag=標誌的模式) String,任何CharSequence的子型別 驗證註解的元素值與指定的正則表示式匹配
@Valid 任何非原子型別 指定遞迴驗證關聯的物件;如使用者物件中有個地址物件屬性,如果想在驗證使用者物件時一起驗證地址物件的話,在地址物件上加@Valid註解即可級聯驗證

此處只列出Hibernate Validator提供的大部分驗證約束註解,請參考hibernate validator官方文件瞭解其他驗證約束註解和進行自定義的驗證約束註解定義。

相關推薦

springmvc 使用JSR-303進行資料

專案中,通常使用較多的是前端的校驗,比如頁面中js校驗以及form表單使用bootstrap校驗。然而對於安全要求較高點建議在服務端進行校驗。 服務端校驗: 控制層controller:校驗頁面請求的引數的合法性。在服務端控制層controller校驗

SpringMVC中的 JSR 303 數據框架說明

bind 工作 電子 支持 length spring容器 error digits 獲取 JSR 303 是java為Bean數據合法性校驗提供的標準框架,它已經包含在JavaEE 6.0中。 JSR 303 通過在Bean屬性上標註類似於@NotNull、@Max等標

jsr-303 參數-學習(轉)

stirng 取消 案例分析 信息 included 什麽 bean alias 進行 1、是什麽? JSR303 是一套 JavaBean 參數校驗的標準,它定義了很多常用的校驗註解,比如: --------------------------------

jsr-303 參數—自定義註解

nbsp 們的 else spa efault ssa password 為什麽 ini 1、為什麽要自定義? 通過上篇學習,了解到很多常用註解了,但是呢,總是有那麽些需求.... 2、案例分析(手機號格式) 2.1、需要驗證的實體 Bean pu

JSR-303 數據學習

blank protoc npr 實踐 ron 控制 empty 表單提交 官方 @ConfigurationProperties標識的類支持JSR-303校驗 JSR 303 - Bean Validation 介紹及最佳實踐 一、JSR-303簡介JSR-3

WPF使用IDataErrorInfo進行資料

原文: WPF使用IDataErrorInfo進行資料校驗 這篇部落格將介紹如何使用IDataErrorInfo進行資料校驗。下面直接看例子。一個Customer類,兩個屬性(FirstName, Age) class Customer { public string FirstName

RestEasy 3.x 系列:使用Hibernate_Validator進行資料

使用Hibernate_Validator進行資料校驗,好處不言而喻:規範統一,低耦合度。 1.pom.xml <dependency> <groupId>org.hibernate</groupId> <artifactId>hibe

SpringMVC 使用JSR-303進行Bean Validation------指定分組驗證順序

接下來我們來看看通過分組來指定順序;還記得之前的錯誤訊息嗎?如果我們先驗證一個訊息;如果不通過再驗證另一個怎麼辦?可以通過@GroupSequence指定分組驗證順序: @Data @NoArgsConstructor @AllArgsConstructo

SpringMVC 使用JSR-303進行Bean Validation-----訊息中使用EL表示式

假設我們需要顯示如:使用者名稱[NAME]長度必須在[MIN]到[MAX]之間,此處大家可以看到,我們不想把一些資料寫死,如NAME、MIN、MAX;此時我們可以使用EL表示式。 @Length(min = 5, max = 20, message = "

使用JSR-303進行 @Valid

規則 表單 hat ssa 正則表達式 需要 使用 pre 元素 一、在SringMVC中使用 使用註解 1、準備校驗時使用的JAR validation-api-1.0.0.GA.jar:JDK的接口; hibernate-validator-4.2.0.Final.ja

JSR-303 資料學習(一)

一、JSR-303簡介 JSR-303 是 JAVA EE 6 中的一項子規範,叫做 Bean Validation,官方參考實現是Hibernate Validator。 此實現與 Hibernate ORM 沒有任何關係。 JSR 303 用於對 Java B

SpringMVC資料註解

@AssertFalse 被註解的元素必須為false @AssertTrue 被註解的元素必須為false @DecimalMax(value) 被註解的元素必須為一個數字,其值必須小於等於指定的最小值 @DecimalMin(Value) 被註解的元素必須為一個數字,其值必須大於等於指定的最小值 @Dig

SpringMVC總結--資料格式轉換和資料

SpringMVC資料繫結流程        A:SpingMVC 主框架將 ServletRequest 物件及目標方法的入參例項傳遞 WebDataBinderFactory 例項,以建立DataBinder 例項物件     &nbs

SpringMVC自定義註解進行引數

在我的另一篇部落格中(SpringMVC),學習瞭如何使用Spring MVC結合Hibernate的校驗框架validation(它和hibernate沒有任何關係)對引數進行校驗。在實際專案中,引數的校驗邏輯可能比較複雜,這時我們可以自定義註解來實現引數校驗,下面是一個簡單的例子。 po

SpringMVC自定義註解進行引數(以列舉值是否合法為例)

pom引入springMVC依賴,以springboot專案為例 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-

springmvc 資料

private Integer id; @NotEmpty private String lastName; @Email private String email; //1 male, 0 female private Integer gend

SpringMVC資料轉換、格式化和資料

目錄 5.案例 一、資料轉換 Spring MVC 上下文中內建了很多轉換器,可完成大多數 Java 型別的轉換工作。 1.ConversionService ConversionServ

SpringMVC資料(一)

什麼是資料校驗 這個比較好理解,就是用來驗證客戶輸入的資料是否合法,比如客戶登入時,使用者名稱不能為空,或者不能超出指定長度等要求,這就叫做資料校驗。資料校驗分為客戶端校驗和服務端校驗 客戶端校驗:js校驗 服務端校驗:springmvc使用validat

SpringMVC學習06】SpringMVC中的資料

  這一篇博文主要總結一下springmvc中對資料的校驗。在實際中,通常使用較多是前端的校驗,比如頁面中js校驗,對於安全要求較高的建議在服務端也要進行校驗。服務端校驗可以是在控制層conroller

對檔案或資料進行CRC

用於對一個檔案進行CRC校驗,以確保檔案資料傳輸的正確性。 廢話不多說,直接上程式碼! crc32.h #ifndef CRC_32_H #define CRC_32_H #ifdef __cplusplus extern "C" { #endif void init_c