Spring 完成數據后端校驗 及其原理


數據的校驗是做web開發不可或缺的部分,前端的js校驗可以涵蓋大部分的校驗職責,如用戶名唯一性,生日格式,郵箱格式校驗等等常用的校驗。但是為了避免用戶繞過瀏覽器,使用http工具直接向后端請求一些違法數據,服務端的數據校驗也是必要的。這樣避免了臟數據落到數據庫中也避免了一些無效的操作。

1.JSR303/JSR-349,hibernate validation,spring validation之間的關系:

JSR303是一項標准,JSR-349是其的升級版本,添加了一些新特性,他們規定一些校驗規范即校驗注解,如@Null,@NotNull,@Pattern,他們位於javax.validation.constraints包下,只提供規范不提供實現。而hibernate validation是對這個規范的實踐(不要將hibernate和數據庫orm框架聯系在一起),他提供了相應的實現,並增加了一些其他校驗注解,如@Email,@Length,@Range等等,他們位於org.hibernate.validator.constraints包下。

2.校驗的方式,目前我們的project中,大部分是在后端自己寫邏輯進行校驗,比如判斷日期格式是否是yyyy-mm-dd,或者判斷傳入參數是否是限定的幾個中的一個,這導致寫了很多無聊的邏輯....其實spring提供了校驗的類庫, 我們可以在其基礎上構建自己需要的功能。

 

構建校驗的順序:

1.創建需要被校驗的實體類

2.在@Controller中校驗數據

值得注意的地方:

<1> 參數Foo前需要加上@Validated注解,表明需要spring對其進行校驗,而校驗的信息會存放到其后的BindingResult中。注意,必須相鄰,如果有多個參數需要校驗,形式可以如下。foo(@Validated Foo foo, BindingResult fooBindingResult ,@Validated Bar bar, BindingResult barBindingResult);即一個校驗類對應一個校驗結果。

<2> 校驗結果會被自動填充,在controller中可以根據業務邏輯來決定具體的操作,如跳轉到錯誤頁面。

下面着重介紹下自定義校驗,比如最近的一個需求,前端傳入String 類型的參數duration,周期只能是4w,12w,26w,52w,104w這五個中的一個,如果不是,返回invalidArgumention,這種惡心又必要的功能,還是交給自定義校驗好了。。。。。。

自定義校驗順序:

1.創建自定義注解

 

validatedBy 中填寫自己傳教的校驗類

2.編寫自己的校驗類

校驗類要繼承ConstraintValidator,然后isValid函數里面驗證參數是否有效。

3.在Controller方法中傳入校驗類類型的參數

 

原理及其調用鏈:

在分發url請求調用doDispatch之后,resolveArgument

然后調用SpringValidatorAdapter下的方法

https://www.cnkirito.moe/2017/08/16/%E4%BD%BF%E7%94%A8spring%20validation%E5%AE%8C%E6%88%90%E6%95%B0%E6%8D%AE%E5%90%8E%E7%AB%AF%E6%A0%A1%E9%AA%8C/


免責聲明!

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



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