SpringBoot
是為了簡化Spring
應用的創建、運行、調試、部署等一系列問題而誕生的產物,自動裝配的特性讓我們可以更好的關注業務本身而不是外部的XML配置,我們只需遵循規范,引入相關的依賴就可以輕易的搭建出一個 WEB 工程
對於任何一個應用而言,客戶端做的數據有效性驗證都不是安全有效的,而數據驗證又是一個企業級項目架構上最為基礎的功能模塊
,這時候就要求我們在服務端接收到數據的時候也對數據的有效性進行驗證。為什么這么說呢?往往我們在編寫程序的時候都會感覺后台的驗證無關緊要,畢竟客戶端已經做過驗證了,后端沒必要在浪費資源對數據進行驗證了,但恰恰是這種思維最為容易被別人鑽空子。畢竟只要有點開發經驗的都知道,我們完全可以模擬 HTTP
請求到后台地址,模擬請求過程中發送一些涉及系統安全的數據到后台,后果可想而知….
為什么要輕松搞定?
相信通過上面的閱讀,大家對數據驗證的重要性有了一定的了解,那么為什么我這里要說 輕松搞定呢?
下面這段代碼很多人一定見到過,就是對參數進行有效性校驗,但仔細觀察的話就會發現;隨着參數的增加,格式的變化,校驗數據有效性的代碼愈發的繁瑣雜亂,一點都不輕松
1 |
public String test1(String name) { |
本章目標
通過 Spring Boot
完成參數后台數據校驗,輕松搞定數據有效性驗證,留出更多的時間來和小姐姐聊天…
具體代碼
看看是如何輕松搞定的….
導入依賴
在 pom.xml
中添加上 spring-boot-starter-web
的依賴即可
1 |
<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 |
package com.battcn.pojo; |
控制層
與前面的代碼相比,新的代碼中僅僅多了幾個注解而已。(此處只是為了圖方便寫在了 Controller 層,同理你可以將它作用在 Service 層)
注解介紹
@Validated:
開啟數據有效性校驗,添加在類上即為驗證方法,添加在方法參數中即為驗證參數對象。(添加在方法上無效)@NotBlank:
被注釋的字符串不允許為空(value.trim() > 0 ? true : false
)@Length:
被注釋的字符串的大小必須在指定的范圍內@NotNull:
被注釋的字段不允許為空(value != null ? true : false
)@DecimalMin:
被注釋的字段必須大於或等於指定的數值
1 |
package com.battcn.controller; |
主函數
1 |
package com.battcn; |
測試
完成准備事項后,啟動 Chapter18Application
自行測試即可,測試手段相信大伙都不陌生了,如 瀏覽器
、postman
、junit
、swagger
,此處基於 postman
,如果你覺得自帶的異常信息不夠友好,那么配上一起來學SpringBoot | 第十八篇:輕松搞定全局異常 可以輕松搞定…
test2接口(name參數沒傳)
test3接口(price參數值過低)