上一篇文章我們了解了Spring Boot Web相關(guān)的知識,初步了解了spring-boot-starter-web,還了解了@Contrler和@RestController的差別,如果使用@Controller注解只返回?cái)?shù)據(jù)則需要使用@ResponseBody注解。與此同時(shí)還了解了@RequestMapping注解與URL映射,URL映射可以分為URL路徑匹配、Method匹配、consumes和produces匹配、params和header匹配。這篇文章我們將會介紹數(shù)據(jù)校驗(yàn),對于任何應(yīng)用系統(tǒng)而言,任何客戶端傳入的數(shù)據(jù)都不是絕對安全有效的,這就要求我們在服務(wù)端接收到數(shù)據(jù)時(shí)需要對傳入的數(shù)據(jù)的有效性進(jìn)行驗(yàn)證,以確保傳入的數(shù)據(jù)安全正確。
Hibernate Validator簡介
目前數(shù)據(jù)校驗(yàn)的規(guī)范和組件有很多,Spring Boot默認(rèn)使用的數(shù)據(jù)校驗(yàn)組件是基于JSR數(shù)據(jù)校驗(yàn)規(guī)范的Hibernate Validator,其中常用的注解如下表所示
注解 | 作用目標(biāo) | 檢查規(guī)則 |
---|---|---|
@NotNull | 屬性 | 檢查值是否為空 |
@Null | 屬性 | 檢查值必須為空 |
@AsserFalse | 屬性 | 檢查演算結(jié)果是否為false |
@AssertTrue | 屬性 | 檢查演算結(jié)果是否為true |
@Max(value=) | 屬性(以numeric或string類型表示一個(gè)數(shù)字) | 檢查值是否小于或等于最大值 |
@Min(value=) | 屬性(以numeric或string類型表示一個(gè)數(shù)字) | 檢查值是否大于或等于最小值 |
@Size(min=, max=) | 屬性(array,collection,map) | 檢查元素大小是否在最大值和最小值之間(包括臨界值) |
@Digits(integer,fraction) | 屬性 | 檢查元素必須是數(shù)字且在范圍內(nèi) |
@Past | 屬性(data或calender) | 檢查日期是否是過去的日期 |
@Feature | 屬性data或calender) | 檢查日期是否是未來的日期 |
@Pattern(regex="rexgex",flag=) | 屬性 | 檢查值是否與正則表達(dá)式匹配 |
@Range(min=,max=) | 屬性(以numeric或string類型表示一個(gè)數(shù)字) | 檢查元素大小是否在最大值和最小值之間(包括臨界值) |
@Length(min=,max=) | 屬性(String) | 檢查字符串長度是否符合范圍 |
屬性(String) | 檢查是否是有效的Email地址 | |
@NotEmpty | 屬性(String) | 檢查字符串不能為空 |
使用Hibernate Validator校驗(yàn)數(shù)據(jù)需要定義一個(gè)接受的數(shù)據(jù)模型,使用注解的形式描述字段的校驗(yàn)規(guī)則,下面以User對象為例說明如何校驗(yàn)數(shù)據(jù),先加入以下依賴:
<dependency>
<groupId>org.springframework.boot<span class="hljs-name"groupId>
<artifactId>spring-boot-starter-validation<span class="hljs-name"artifactId>
<span class="hljs-name"dependency>
JavaBean參數(shù)校驗(yàn)
Post請求參數(shù)較多時(shí)可以在對應(yīng)的數(shù)據(jù)模型(Java Bean)中進(jìn)行校驗(yàn),通過注解來指定字段校驗(yàn)的規(guī)則。
public class User {
@NotBlank(message = "姓名不允許為空")
@Length(min = 2, max = 10, message = "姓名長度錯(cuò)誤,姓名長度2-10")
private String Name;
@NotNull(message = "年齡不能為空!")
@Min(18)
private int age;
@NotBlank(message = "地址不能為空!")
private String address;
@Email(message = "郵箱格式錯(cuò)誤")
private String email;
//省略get和set方法
}
上述例子中,每個(gè)message是數(shù)據(jù)校驗(yàn)不通過時(shí)要給出的提示信息。然后需要添加數(shù)據(jù)校驗(yàn)方法。
@PostMapping(path = "/check")
public String check(@RequestBody @Valid User user, BindingResult result) {
String name = user.getName();
if (result.hasErrors()) {
List
上面例子中BindingResult是驗(yàn)證不通過的結(jié)果集合,必須跟在被校驗(yàn)參數(shù)后,若被校驗(yàn)參數(shù)之后沒有BindingResult則會拋出BindException異常。
JavaBean對象的級聯(lián)校驗(yàn)
在對象的普通屬性上我們可以直接使用注解進(jìn)行數(shù)據(jù)校驗(yàn),對于關(guān)聯(lián)對象也很容易,在關(guān)聯(lián)對象上添加@Valid注解,關(guān)聯(lián)對象內(nèi)部可以正常使用數(shù)據(jù)校驗(yàn)注解。代碼如下:
public class User {
@NotBlank(message = "姓名不允許為空")
@Length(min = 2, max = 10, message = "姓名長度錯(cuò)誤,姓名長度2-10")
private String Name;
@NotNull(message = "年齡不能為空!")
@Min(18)
private int age;
@NotBlank(message = "地址不能為空!")
private String address;
@Email(message = "郵箱格式錯(cuò)誤")
private String email;
@NotNull(message = "detail不能為空")
@Valid
private UserDetail detail;
//省略get和set方法
}
public class UserDetail {
@NotNull(message = "id不能為空")
private String id;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
}
分組校驗(yàn)
在不同的情況下,可能對相同javaBean對象的數(shù)據(jù)校驗(yàn)規(guī)則有所不同,有時(shí)需要根據(jù)狀態(tài)數(shù)據(jù)對javaBean中的某些屬性字段進(jìn)行單獨(dú)驗(yàn)證。這時(shí)候就可以使用分組校驗(yàn)功能,即根據(jù)狀態(tài)啟用一組約束,Hibernate Validator的注解提供了groups參數(shù)用于指定分組,如果沒有指定groups參數(shù),則默認(rèn)屬于javax.validation.groups.Default。接下來我們舉例來說明這一過程。
首先創(chuàng)建分組GroupA和GroupB如下,這兩個(gè)接口作為兩個(gè)校驗(yàn)規(guī)則的分組。
public interface GroupA {
}
public interface GroupB {
}
然后創(chuàng)建實(shí)體類Person,并在相關(guān)字段定義分組校驗(yàn)規(guī)則。
public class Person {
@NotBlank(message = "userId不能為空", groups = {GroupA.class})
private String userId;
@NotBlank(message = "用戶名不能為空", groups = {GroupB.class})
private String name;
@Range(min=20, max = 30, message = "年齡必須在【20,30】", groups = {GroupA.class})
@Range(min = 30, max = 40, message = "年齡必須在【30,40】", groups = {GroupB.class})
private int age;
//省略來get方法和set方法
}
上述例子中,在age
字段使用了兩個(gè)校驗(yàn)規(guī)則,GroupA年齡要在20-30,GroupB年齡要在30-40。最后使用分組:
@RequestMapping("/save")
public String save(@RequestBody @Validated({ GroupA.class, Default.class}) Person person, BindingResult result) {
if (result.hasErrors()) {
List
其中@Validated
注解中增加了{(lán)GroupA.class, Default.class}參數(shù)表示對于定義了分組校驗(yàn)規(guī)則的字段使用GroupA規(guī)則,其他使用默認(rèn)規(guī)則。
-
Web
+關(guān)注
關(guān)注
2文章
1287瀏覽量
71367 -
URL
+關(guān)注
關(guān)注
0文章
141瀏覽量
15857 -
spring
+關(guān)注
關(guān)注
0文章
340瀏覽量
15054 -
服務(wù)端
+關(guān)注
關(guān)注
0文章
68瀏覽量
7228
發(fā)布評論請先 登錄
Spring Boot如何實(shí)現(xiàn)異步任務(wù)
Spring Boot Starter需要些什么

啟動(dòng)Spring Boot項(xiàng)目應(yīng)用的三種方法
Spring Boot從零入門1 詳述
Spring Boot實(shí)現(xiàn)各種參數(shù)校驗(yàn)
Spring Boot特有的實(shí)踐
強(qiáng)大的Spring Boot 3.0要來了
Spring Boot Web相關(guān)的基礎(chǔ)知識
Spring Boot應(yīng)用中如何做好參數(shù)校驗(yàn)?
Spring Boot應(yīng)用中如何做好參數(shù)校驗(yàn)?2
Spring Boot如何優(yōu)雅實(shí)現(xiàn)數(shù)據(jù)加密存儲、模糊匹配和脫敏

Spring Boot Actuator快速入門
Spring Boot啟動(dòng) Eureka流程

Spring Boot的啟動(dòng)原理

評論