輕松搞定數據驗證(一)


SpringBoot 是為了簡化 Spring 應用的創建、運行、調試、部署等一系列問題而誕生的產物,自動裝配的特性讓我們可以更好的關注業務本身而不是外部的XML配置,我們只需遵循規范,引入相關的依賴就可以輕易的搭建出一個 WEB 工程

對於任何一個應用而言,客戶端做的數據有效性驗證都不是安全有效的,而數據驗證又是一個企業級項目架構上最為基礎的功能模塊,這時候就要求我們在服務端接收到數據的時候也對數據的有效性進行驗證。為什么這么說呢?往往我們在編寫程序的時候都會感覺后台的驗證無關緊要,畢竟客戶端已經做過驗證了,后端沒必要在浪費資源對數據進行驗證了,但恰恰是這種思維最為容易被別人鑽空子。畢竟只要有點開發經驗的都知道,我們完全可以模擬 HTTP 請求到后台地址,模擬請求過程中發送一些涉及系統安全的數據到后台,后果可想而知….

為什么要輕松搞定?

相信通過上面的閱讀,大家對數據驗證的重要性有了一定的了解,那么為什么我這里要說 輕松搞定呢?

下面這段代碼很多人一定見到過,就是對參數進行有效性校驗,但仔細觀察的話就會發現;隨着參數的增加,格式的變化,校驗數據有效性的代碼愈發的繁瑣雜亂,一點都不輕松

1
2
3
4
5
6
7
8
9
public String test1(String name) {
if (name == null) {
throw new NullPointerException("name 不能為空");
}
if (name.length() < 2 || name.length() > 10) {
throw new RuntimeException("name 長度必須在 2 - 10 之間");
}
return "success";
}

本章目標

通過 Spring Boot 完成參數后台數據校驗,輕松搞定數據有效性驗證,留出更多的時間來和小姐姐聊天…

具體代碼

看看是如何輕松搞定的….

導入依賴

在 pom.xml 中添加上 spring-boot-starter-web 的依賴即可

1
2
3
4
5
6
7
8
9
10
11
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>

JSR-303 注釋介紹

這里只列舉了 javax.validation 包下的注解,同理在 spring-boot-starter-web 包中也存在 hibernate-validator 驗證包,里面包含了一些 javax.validation 沒有的注解,有興趣的可以看看

注解 說明
@NotNull 限制必須不為null
@NotEmpty 驗證注解的元素值不為 null 且不為空(字符串長度不為0、集合大小不為0)
@NotBlank 驗證注解的元素值不為空(不為null、去除首位空格后長度為0),不同於@NotEmpty,@NotBlank只應用於字符串且在比較時會去除字符串的空格
@Pattern(value) 限制必須符合指定的正則表達式
@Size(max,min) 限制字符長度必須在 min 到 max 之間(也可以用在集合上)
@Email 驗證注解的元素值是Email,也可以通過正則表達式和flag指定自定義的email格式
@Max(value) 限制必須為一個不大於指定值的數字
@Min(value) 限制必須為一個不小於指定值的數字
@DecimalMax(value) 限制必須為一個不大於指定值的數字
@DecimalMin(value) 限制必須為一個不小於指定值的數字
@Null 限制只能為null(很少用)
@AssertFalse 限制必須為false (很少用)
@AssertTrue 限制必須為true (很少用)
@Past 限制必須是一個過去的日期
@Future 限制必須是一個將來的日期
@Digits(integer,fraction) 限制必須為一個小數,且整數部分的位數不能超過 integer,小數部分的位數不能超過 fraction (很少用)

實體類

為了體現 validation 的強大,分別演示普通參數屬性驗證與對象的驗證

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
package com.battcn.pojo;

import org.hibernate.validator.constraints.Length;

import javax.validation.constraints.DecimalMin;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import java.math.BigDecimal;

/**
* @author Levin
* @since 2018/6/5 0005
*/
public class Book {

private Integer id;
@NotBlank(message = "name 不允許為空")
@Length(min = 2, max = 10, message = "name 長度必須在 {min} - {max} 之間")
private String name;
@NotNull(message = "price 不允許為空")
@DecimalMin(value = "0.1", message = "價格不能低於 {value}")
private BigDecimal price;

// 省略 GET SET ...
}

控制層

與前面的代碼相比,新的代碼中僅僅多了幾個注解而已。(此處只是為了圖方便寫在了 Controller 層,同理你可以將它作用在 Service 層)

注解介紹

  • @Validated: 開啟數據有效性校驗,添加在類上即為驗證方法,添加在方法參數中即為驗證參數對象。(添加在方法上無效)
  • @NotBlank: 被注釋的字符串不允許為空(value.trim() > 0 ? true : false
  • @Length: 被注釋的字符串的大小必須在指定的范圍內
  • @NotNull: 被注釋的字段不允許為空(value != null ? true : false)
  • @DecimalMin: 被注釋的字段必須大於或等於指定的數值
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
package com.battcn.controller;

import com.battcn.pojo.Book;
import org.hibernate.validator.constraints.Length;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.validation.constraints.NotBlank;

/**
* 參數校驗
*
* @author Levin
* @since 2018/6/04 0031
*/
@Validated
@RestController
public class ValidateController {

@GetMapping("/test2")
public String test2(@NotBlank(message = "name 不能為空") @Length(min = 2, max = 10, message = "name 長度必須在 {min} - {max} 之間") String name) {
return "success";
}

@GetMapping("/test3")
public String test3(@Validated Book book) {
return "success";
}
}

主函數

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
package com.battcn;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;


/**
* @author Levin
*/
@SpringBootApplication
public class Chapter18Application {

public static void main(String[] args) {
SpringApplication.run(Chapter18Application.class, args);
}
}

測試

完成准備事項后,啟動 Chapter18Application 自行測試即可,測試手段相信大伙都不陌生了,如 瀏覽器postmanjunitswagger,此處基於 postman,如果你覺得自帶的異常信息不夠友好,那么配上一起來學SpringBoot | 第十八篇:輕松搞定全局異常 可以輕松搞定…

test2接口(name參數沒傳)

test2接口test2接口

test3接口(price參數值過低)

test3接口test3接口


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM