1. 程式人生 > >SpringBoot 輕鬆搞定資料驗證 (一)

SpringBoot 輕鬆搞定資料驗證 (一)

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

本章目標

通過 Spring Boot 完成引數後臺資料校驗,輕鬆搞定資料有效性驗證,留出更多的時間來和小姐姐聊天...


建立專案

檢視依賴

    <dependencies>
        <!-- 預設就內嵌了Tomcat 容器,如需要更換容器也極其簡單-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!-- 測試包,當我們使用 mvn package 的時候該包並不會被打入,因為它的生命週期只在 test 之內-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

JSR-303 介紹

   JSR 是Java Specification Requests 的縮寫,是指向 JCP(Java Community Process) 提出新增一個標準化技術規範的正式請求。

   任何人都可以提交 JSR,以向 Java 平臺增添新的 API 和服務,已稽核通過的規範涉及 Java 各個領域,有興趣可以瞭解一下。

   Bean Validation 是一個執行時的資料驗證框架,為 JavaBean 驗證定義了相應的元資料模型和 API。

   預設的元資料是 Java Annotations,當然也可以使用 XML 可以對已存在的元資料資訊進行覆蓋和擴充套件。

   在應用中通過使用 Bean Validation 或是你自己定義的 constraint,例如 @NotNull, @Max, @ZipCode, 就可以確保資料模型的正確性。

   constraint 可以註解到欄位,getter 方法,類或者介面上面。對於一些特定的需求,使用者可以很容易的開發定製化的 constraint。

這裡只列舉了 javax.validation 包下的註解,同理在 spring-boot-starter-web 包中也存在 hibernate-validator 驗證包,裡面包含了一些 javax.validation

實體類

為了體現 validation 的強大,分別演示普通引數屬性驗證與物件的驗證

/**
 * @author Ray
 * @date 2018/7/4 0004
 */
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;
    
    // 省略setter/getter
}

控制層

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

/**
 * @author Ray
 * @date 2018/7/4 0004
 * 引數校驗
 */
@Validated
@RestController
public class ValidateController1 {

    @GetMapping("/test1")
    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";
    }

    @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";
    }
}

測試

完成準備事項後,啟動專案自行測試即可,測試手段相信大夥都不陌生了,如 瀏覽器postmanjunitswagger,此處基於 postman

>test1介面 (name引數)




>test2介面 (name引數沒傳)




>test3介面 (price引數值過低)