javascript
SpringBoot 轻松搞定数据验证 (一)
感謝作者:?http://www.spring4all.com/article/1224
對(duì)于任何一個(gè)應(yīng)用而言,客戶端做的數(shù)據(jù)有效性驗(yàn)證都不是安全有效的,而數(shù)據(jù)驗(yàn)證又是一個(gè)企業(yè)級(jí)項(xiàng)目架構(gòu)上最為基礎(chǔ)的功能模塊,這時(shí)候就要求我們?cè)诜?wù)端接收到數(shù)據(jù)的時(shí)候也對(duì)數(shù)據(jù)的有效性進(jìn)行驗(yàn)證。為什么這么說呢?往往我們?cè)诰帉懗绦虻臅r(shí)候都會(huì)感覺后臺(tái)的驗(yàn)證無關(guān)緊要,畢竟客戶端已經(jīng)做過驗(yàn)證了,后端沒必要在浪費(fèi)資源對(duì)數(shù)據(jù)進(jìn)行驗(yàn)證了,但恰恰是這種思維最為容易被別人鉆空子。畢竟只要有點(diǎn)開發(fā)經(jīng)驗(yàn)的都知道,我們完全可以模擬?HTTP?請(qǐng)求到后臺(tái)地址,模擬請(qǐng)求過程中發(fā)送一些涉及系統(tǒng)安全的數(shù)據(jù)到后臺(tái),后果可想而知....
本章目標(biāo)
通過?Spring Boot?完成參數(shù)后臺(tái)數(shù)據(jù)校驗(yàn),輕松搞定數(shù)據(jù)有效性驗(yàn)證,留出更多的時(shí)間來和小姐姐聊天...
創(chuàng)建項(xiàng)目
查看依賴
JSR-303 介紹
? ?JSR 是Java Specification Requests 的縮寫,是指向 JCP(Java Community Process) 提出新增一個(gè)標(biāo)準(zhǔn)化技術(shù)規(guī)范的正式請(qǐng)求。
? ?任何人都可以提交 JSR,以向 Java 平臺(tái)增添新的 API 和服務(wù),已審核通過的規(guī)范涉及 Java 各個(gè)領(lǐng)域,有興趣可以了解一下。
? ?Bean Validation 是一個(gè)運(yùn)行時(shí)的數(shù)據(jù)驗(yàn)證框架,為 JavaBean 驗(yàn)證定義了相應(yīng)的元數(shù)據(jù)模型和 API。
? ?默認(rèn)的元數(shù)據(jù)是 Java Annotations,當(dāng)然也可以使用 XML 可以對(duì)已存在的元數(shù)據(jù)信息進(jìn)行覆蓋和擴(kuò)展。
? ?在應(yīng)用中通過使用 Bean Validation 或是你自己定義的 constraint,例如 @NotNull, @Max, @ZipCode, 就可以確保數(shù)據(jù)模型的正確性。
? ?constraint 可以注解到字段,getter 方法,類或者接口上面。對(duì)于一些特定的需求,用戶可以很容易的開發(fā)定制化的 constraint。
這里只列舉了?javax.validation?包下的注解,同理在?spring-boot-starter-web?包中也存在?hibernate-validator?驗(yàn)證包,里面包含了一些?javax.validation?沒有的注解,有興趣的可以看看?https://www.ibm.com/developerworks/cn/java/j-lo-jsr303/
實(shí)體類
為了體現(xiàn)?validation?的強(qiáng)大,分別演示普通參數(shù)屬性驗(yàn)證與對(duì)象的驗(yàn)證
/*** @author Ray* @date 2018/7/4 0004*/ public class Book {private Integer id;@NotBlank(message = "name 不允許為空")@Length(min = 2, max = 10, message = "name 長(zhǎng)度必須在 {min} - {max} 之間")private String name;@NotNull(message = "price 不允許為空")@DecimalMin(value = "0.1", message = "價(jià)格不能低于 {value}")private BigDecimal price;// 省略setter/getter }控制層
與前面的代碼相比,新的代碼中僅僅多了幾個(gè)注解而已。(此處只是為了圖方便寫在了 Controller 層,同理你可以將它作用在 Service 層)
/*** @author Ray* @date 2018/7/4 0004* 參數(shù)校驗(yàn)*/ @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 長(zhǎng)度必須在 2 - 10 之間");}return "success";}@GetMapping("/test2")public String test2(@NotBlank(message = "name 不能為空") @Length(min = 2, max = 10, message = "name 長(zhǎng)度必須在 {min} - {max} 之間")String name){return "success";}@GetMapping("/test3")public String test3(@Validated Book book){return "success";} }測(cè)試
完成準(zhǔn)備事項(xiàng)后,啟動(dòng)項(xiàng)目,自行測(cè)試即可,測(cè)試手段相信大伙都不陌生了,如?瀏覽器、postman、junit、swagger,此處基于?postman
>test1接口 (name參數(shù))
>test2接口?(name參數(shù)沒傳)
>test3接口?(price參數(shù)值過低)
總結(jié)
以上是生活随笔為你收集整理的SpringBoot 轻松搞定数据验证 (一)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python自学第七天之字典的增删改查
- 下一篇: SpringBoot 轻松搞定数据验证