springmvc 使用JSR-303進行資料校驗
專案中,通常使用較多的是前端的校驗,比如頁面中js校驗以及form表單使用bootstrap校驗。然而對於安全要求較高點建議在服務端進行校驗。
服務端校驗:
- 控制層controller:校驗頁面請求的引數的合法性。在服務端控制層controller校驗,不區分客戶端型別。
- 業務層service(使用較多):主要校驗關鍵業務引數,僅限於service介面中使用的引數。
- 持久層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