摘要:前言估計很多朋友都認為參數校驗是客戶端的職責,不關服務端的事。輕則導致服務器宕機,重則泄露數據。所以,這時就需要設置第二道關卡,服務端驗證了。老項目的服務端校驗不能為空不能為空看以上代碼,就一個的校驗就如此麻煩。
前言
估計很多朋友都認為參數校驗是客戶端的職責,不關服務端的事。其實這是錯誤的,學過 Web 安全的都知道,客戶端的驗證只是第一道關卡。它的參數驗證并不是安全的,一旦被有心人抓到可乘之機,他就可以有各種方法來摸擬系統的 Http 請求,訪問數據庫的關鍵數據。輕則導致服務器宕機,重則泄露數據。所以,這時就需要設置第二道關卡,服務端驗證了。
老項目的服務端校驗@RestController @RequestMapping("/student") public class ValidateOneController { @GetMapping("/id") public Student findStudentById(Integer id){ if(id == null){ logger.error("id 不能為空!"); throw new NullPointerException("id 不能為空"); } return studentService.findStudentById(id); } }
看以上代碼,就一個的校驗就如此麻煩。那我們是否有好的統一校驗方法呢?鑒于 SpringBoot 無所不能。答案當然是有的。
其中,Bean Validator 和 Hibernate Validator 就是兩套用于驗證的框架,二者都遵循 JSR-303 ,可以混著用,鑒于二者的某些 Validator 注解有差別,例如 @Length 在 Bean Validator 中是沒有的,所以這里我選擇混合用。
JSR-303JSR-303 是JAVA EE 6 中的一項子規范,叫做 Bean Validation,Hibernate Validator 是 Bean Validation 的參考實現, Hibernate Validator 提供了 JSR 303 規范中所有內置 Constraint(約束) 的實現,除此之外還有一些附加的 Constraint 。這些 Constraint (約束) 全都通過注解的方式實現,請看下面兩個表。
Bean Validation 中內置的約束:
注解 | 作用 |
---|---|
@Null | 被注解參數必須為空 |
@NotNull | 被注解參數不能為空 |
@AssertTrue | 被注解參數必須為 True |
@AssertFalse | 被注解參數必須為 False |
@Min(value) | 被注解參數必須是數字,且其值必須大于等于 value |
@Max(value) | 被注解參數必須是數字,且其值必須小于等于 value |
@DecimaMin(value) | 被注解參數必須是數字,且其值必須大于等于 value |
@DecimaMax(value) | 被注解參數必須是數字,且其值必須小于等于 value |
@Size(max, min) | 被注解參數大小必須在指定范圍內 |
@Past | 被注解參數必須是一個過去的日期 |
@Future | 被注解參數必須是一個將來的日期 |
@Pattern(value) | 被注解參數必須符合指定的正則表達式 |
@Digits(integer, fraction) | 被注解參數必須是數字,且其值必須在可接受范圍內 |
@NotBlank | 被注解參數的值不為空(不為 null、去除首位空格后長度為 0),不同于 @NotEmpty,@NotBlank 只應用于字符串且在比較時會去除字符串的空格 |
Hibernate Validator 附加的約束:
注解 | 作用 |
---|---|
@NotEmpty | 被注解參數的值不為 null 且不為空(字符串長度不為0、集合大小不為0) |
被注解參數必須是電子郵箱地址 | |
@Length | 被注解的字符串長度必須在指定范圍內 |
@Range | 被注解的參數必須在指定范圍內 |
SpringBoot 2.1.3
IDEA
JDK8
Pom 文件依賴實體類org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot-starter-test test org.projectlombok lombok true
用于測試,加入了參數校驗規則。
@Data @AllArgsConstructor @NoArgsConstructor public class Student { private Integer id; @NotBlank(message = "學生名字不能為空") @Length(min = 2, max = 10, message = "name 長度必須在 {min} - {max} 之間") private String name; @NotNull(message = "年齡不允許為空") @Min(value = 0, message = "年齡不能低于 {value} 歲") private Integer age; }Controller 層
寫了兩個方法,一個用于校驗普通參數,一個用于校驗對象
@Validated //開啟數據校驗,添加在類上用于校驗方法,添加在方法參數中用于校驗參數對象。(添加在方法上無效) @RestController @RequestMapping("/student") public class ValidateOneController { /** * 普通參數校驗 * @param name * @return */ @GetMapping("/name") public String findStudentByName(@NotBlank(message = "學生名字不能為空") @Length(min = 2, max = 10, message = "name 長度必須在 {min} - {max} 之間")String name){ return "success"; } /** * 對象校驗 * @param student * @return */ @PostMapping("/add") public String addStudent(@Validated @RequestBody Student student){ return "success"; } }Postman 測試
校驗普通參數測試結果:
下圖可以看見,我沒有在 http://localhost:8080/student/name 地址后添加 name 參數,傳到后臺馬上就校驗出異常了。而這個異常信息就是我定義的校驗異常信息。
校驗對象測試結果:
結果有點長:
下圖可以看見,我訪問 http://localhost:8080/student/add 傳入了參數對象,但對象是不能通過校驗規則的,比如 age 參數為負數,name 參數長度太大,傳到后臺馬上就校驗出異常了。而這個異常信息就是我定義的校驗異常信息。
完整代碼https://github.com/turoDog/De...
如果覺得對你有幫助,請給個 Star 再走唄,非常感謝。
后語如果本文對你哪怕有一丁點幫助,請幫忙點好看。你的好看是我堅持寫作的動力。
另外,關注之后在發送 1024 可領取免費學習資料。
資料詳情請看這篇舊文:Python、C++、Java、Linux、Go、前端、算法資料分享
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/73522.html
摘要:注冊流程是從小程序簡稱,以下替代獲取用戶的,給到服務器,服務器會用還有自己的等信息一起去微信服務器請求用戶數據,注意每一個所對應的用戶都是不一樣的。 本博客 貓叔的博客,轉載請申明出處閱讀本文約 5分鐘適讀人群:Java后端、Java初級、小程序前端 前后端項目的地址 ShareBookServer ShareBookClient 小程序前端 showImg(https://seg...
摘要:簡介是阿里巴巴公司開源的一個高性能優秀的服務框架,使得應用可通過高性能的實現服務的輸出和輸入功能,可以和框架無縫集成。它提供了三大核心能力面向接口的遠程方法調用智能容錯和負載均衡服務自動注冊和發現。首先我們需要前往官網下載安裝包。 Dubbo 簡介 Dubbo是阿里巴巴公司開源的一個高性能優秀的服務框架,使得應用可通過高性能的RPC實現服務的輸出和輸入功能,可以和Spring框架無縫集...
摘要:本章目標基于項目搭建可以站外請求訪問的跨域資源服務器。允許所有的請求域名訪問我們的跨域資源,可以固定單條或者多條內容,如,只有百度可以訪問我們的跨域資源。 CORS(Cross-Origin Resource Sharing)跨域資源共享,是一個W3C標準,它允許瀏覽器向跨域服務器發送Ajax請求,打破了Ajax只能訪問本站內的資源限制,CORS在很多地方都有被使用,微信支付的JS支付...
摘要:本章目的基于平臺整合分別完成客戶端服務端的單元測試。在測試控制器內添加了三個測試方法,我們接下來開始編寫單元測試代碼。總結本章主要介紹了基于平臺的兩種單元測試方式,一種是在服務端采用注入方式將需要測試的或者注入到測試類中,然后調用方法即可。 單元測試對于開發人員來說是非常熟悉的,我們每天的工作也都是圍繞著開發與測試進行的,在最早的時候測試都是采用工具Debug模式進行調試程序,后來Ju...
摘要:一什么是摘自官網翻譯采納了建立生產就緒應用程序的觀點。優先于配置的慣例,旨在讓您盡快啟動和運行。致力于簡潔,讓開發者寫更少的配置,程序能夠更快的運行和啟動。二搭建第一個程序可以在上建項目,也可以用構建。已經凌晨了,我要睡了源碼 一.什么是spring boot Takes an opinionated view of building production-ready Spring a...
閱讀 1394·2021-11-08 13:14
閱讀 746·2021-09-23 11:31
閱讀 1038·2021-07-29 13:48
閱讀 2781·2019-08-29 12:29
閱讀 3371·2019-08-29 11:24
閱讀 1899·2019-08-26 12:02
閱讀 3688·2019-08-26 10:34
閱讀 3435·2019-08-23 17:07