自研後端HTTP請求參數驗證器服務ParamertValidateService

来源:https://www.cnblogs.com/HumorChen/archive/2019/04/21/10743492.html
-Advertisement-
Play Games

好處:方便了後端對HTTP請求中參數進行核驗,只需一次編寫效驗器,一行代碼便可對所有參數的pojo進行參數核驗!而且更改效驗邏輯時只需要更改效驗器類即可,實現瞭解耦合。 只需要程式員按照規範開發一個ParameterValidator類(如下圖1),將所有效驗方法寫在該類中即可在任意地方使用一行代碼 ...


好處:方便了後端對HTTP請求中參數進行核驗,只需一次編寫效驗器,一行代碼便可對所有參數的pojo進行參數核驗!而且更改效驗邏輯時只需要更改效驗器類即可,實現瞭解耦合。

只需要程式員按照規範開發一個ParameterValidator類(如下圖1),將所有效驗方法寫在該類中即可在任意地方使用一行代碼實現對所有參數的核驗(如下圖2)

圖1:(圖中寫了對手機號碼和密碼進行核驗的方法)

 

圖二:

 


Jar包:ParameterValidator.jar

url:http://xingxunxinxi.com/ParameterValidator.jar

項目結構:

com.xingxunxinxi.ParameterValidator包含該套參數驗證器服務的介面和預設實現類

HTTP請求參數驗證器服務介面:ParameterValidateService

 1 package com.xingxunxinxi.ParameterValidator;
 2 
 3 /**   
 4  *    
 5  * 項目名稱:ParameterValidator   
 6  * 類名稱:    ParameterValidator   
 7  * 類描述:   ParameterValidateService interface
 8  * 創建人:    HumorChen   
 9  * 創建時間:2019年4月20日 下午7:48:51      
10  * 修改時間:2019年4月20日 下午7:48:51   
11  * 修改備註:   
12  *    
13  */
14 public interface ParameterValidateService {
15     String SUCCESS="SUCCESS";
16     public String validate(Object...objects)throws Exception;
17 }
View Code

預設實現類:DefaultParameterValidateService

  1 package com.xingxunxinxi.ParameterValidator;
  2 
  3 import java.lang.reflect.Field;
  4 import java.lang.reflect.Method;
  5 /**
  6  * 
  7 *    
  8 * 項目名稱:ParameterValidator   
  9 * 類名稱:    DefaultParameterValidateService   
 10 * 類描述:   DefaultParameterValidateService
 11 * 創建人:    HumorChen   
 12 * 創建時間:2019年4月20日 下午11:46:47      
 13 * 修改時間:2019年4月20日 下午11:46:47   
 14 * 修改備註:   
 15 *
 16  */
 17 public class DefaultParameterValidateService implements ParameterValidateService {
 18     //false means return first failure reason,true means return all reasons.
 19     private boolean AllResult=false;
 20     //whether inner-validator is initialized
 21     private boolean initialized=false;
 22     //inner validator object
 23     private Object validator;
 24     //exception message
 25     private static String notValidatorExceptionMessage="This object is not an instance of ParameterValidator";
 26     //separate reason
 27     public  static String ReasonSeparator="\n";
 28     public DefaultParameterValidateService()
 29     {
 30         
 31     }
 32     /**
 33      * parameter AllResult is true means return all fail reasons when validating,false means return the first failure reason
 34      * @param boolean
 35      */
 36     public DefaultParameterValidateService(boolean AllResult)
 37     {
 38         this.AllResult=AllResult;
 39     }
 40     /**
 41      * initialize the validator of ParameterValidatorService
 42      * @param class<?>
 43      * @throws Exception
 44      */
 45     public void init(Class<?>validatorclass) throws Exception
 46     {
 47         init(validatorclass.newInstance());
 48     }
 49     /**
 50      * initialize the validator of ParameterValidatorService
 51      * @param Object
 52      * @throws Exception
 53      */
 54     public void init(Object object) throws Exception
 55     {
 56         if(isValidator(object))
 57         {
 58             this.validator=object;
 59             initialized=true;
 60             System.out.println(this.getClass().getSimpleName()+" initialize success");
 61         }
 62     }
 63     /**
 64      * initialize the validator of ParameterValidatorService
 65      * @param String
 66      * @throws Exception
 67      */
 68     public void init(String classname) throws Exception
 69     {
 70         init(Class.forName(classname).newInstance());
 71     }
 72     /**
 73      * judge whether the object is a validator.
 74      * reference ParametorValidatorDemo
 75      * method-ruler:
 76      * method-name:your property name
 77      * returnType: String
 78      * parameterCount:1
 79      * parameterType:Object
 80      * @param object
 81      * @return boolean
 82      * @throws Exception
 83      */
 84     private boolean isValidator(Object object) throws Exception
 85     {
 86         for(Method method:object.getClass().getDeclaredMethods())
 87             if(method.getParameterCount()==1&&method.getReturnType().equals(String.class)&&method.getParameterTypes()[0].equals(Object.class))
 88                 return true;
 89             else
 90                 throw new Exception(notValidatorExceptionMessage);
 91         return false;
 92     }
 93     
 94     public static void setReasonSeparator(String reasonSeparator) {
 95         ReasonSeparator = reasonSeparator;
 96     }
 97     
 98     public boolean isAllResult() {
 99         return AllResult;
100     }
101     public void setAllResult(boolean allResult) {
102         AllResult = allResult;
103     }
104     /**
105      * validate objects' properties
106      * @param objects
107      * @return String:validate_result
108      */
109     public String validate(Object... objects) throws Exception {
110         if(initialized)
111         {
112             String result="";
113             for(Object object:objects)
114                 for(Field field:object.getClass().getDeclaredFields())
115                 {
116                     field.setAccessible(true);
117                     String fieldresult=(String) validator.getClass().getMethod(field.getName(), Object.class).invoke(validator, field.get(object));
118                     if(AllResult)
119                     {
120                         if(!fieldresult.equals(SUCCESS))
121                             result+=fieldresult+ReasonSeparator;
122                     }
123                     else
124                     {
125                         if(!fieldresult.equals(SUCCESS))
126                             return fieldresult;
127                     }
128                 }
129             return result==""?SUCCESS:result.substring(0, result.length()-ReasonSeparator.length());
130         }
131         else
132             throw new Exception("ParameterValidator not initialized Exception");
133     }
134 
135 }
View Code

示範包:

com.xingxunxinxi.ParameterValidator.Demo

示範參數驗證器類:

 1 package com.xingxunxinxi.ParameterValidator.Demo;
 2 
 3 import com.xingxunxinxi.ParameterValidator.ParameterValidateService;
 4 
 5 /**
 6  * 
 7 *    
 8 * 項目名稱:ParameterValidator   
 9 * 類名稱:    ParameterValidatorDemo   
10 * 類描述:    ParameterValidatorDemo
11 * 創建人:    HumorChen   
12 * 創建時間:2019年4月20日 下午10:07:27      
13 * 修改時間:2019年4月20日 下午10:07:27   
14 * 修改備註:   
15 *
16  */
17 public class ParameterValidatorDemo {
18     /**
19      * we use this method below to validate object's property which named phoneNumber,if phoneNumber's value is legal,this method will return
20      * ParameterValidateService.SUCCESS,or return your individual tip.
21      * @param object
22      * @return String
23      */
24     public String phoneNumber(Object object)
25     {
26         String result="illegal phone number";
27         String regex = "^((13[0-9])|(14[5,7,9])|(15([0-3]|[5-9]))|(166)|(17[0,1,3,5,6,7,8])|(18[0-9])|(19[8|9]))\\d{8}$";
28         if(((String)object).matches(regex))
29             return ParameterValidateService.SUCCESS;
30         return result;
31     }
32     /**
33      * we use this method below to validate object's property which named password,if password's value is legal,this method will return
34      * ParameterValidateService.SUCCESS,or return your individual tip.
35      * @param object
36      * @return
37      */
38     public String password(Object object)
39     {
40         String result="illegal password";
41         String regex = "^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z]{8,20}$";
42         if(((String)object).matches(regex))
43             return ParameterValidateService.SUCCESS;
44         return result;
45     }
46 }
View Code

示範調用類:

 1 package com.xingxunxinxi.ParameterValidator.Demo;
 2 
 3 import com.xingxunxinxi.ParameterValidator.DefaultParameterValidateService;
 4 /**
 5  * 
 6 *    
 7 * 項目名稱:ParameterValidator   
 8 * 類名稱:    UseDemo   
 9 * 類描述:   DefaultParameterValidateService use demo
10 * 創建人:    HumorChen   
11 * 創建時間:2019年4月20日 下午11:47:20      
12 * 修改時間:2019年4月20日 下午11:47:20   
13 * 修改備註:   
14 *
15  */
16 public class UseDemo {
17     static DefaultParameterValidateService dpvs = new DefaultParameterValidateService();
18     static {
19         try {
20             dpvs.init(ParameterValidatorDemo.class);
21         } catch (Exception e) {
22             System.out.println("initialization failure");
23             e.printStackTrace();
24         }
25     }
26 
27     public static void main(String[] args) {
28         String legalphone = "15073207380";
29         String illegalphone = "1507320738";
30         
31         String legalpassword="12345678ABC";
32         String illegalpassword="12345";
33         
34         User user = new User();
35         user.setPhoneNumber(legalphone);
36         user.setPassword(legalpassword);
37         try {
38             System.out.println(user.toString() + "validate result: "
39                     + dpvs.validate(user));
40             user.setPhoneNumber(illegalphone);
41             System.out.println(user.toString() + "validate result: "
42                     + dpvs.validate(user));
43             user.setPassword(illegalpassword);
44             System.out.println(user.toString() + "validate result: "
45                     + dpvs.validate(user));
46             dpvs.setAllResult(true);
47             System.out.println(user.toString() + "validate result: "
48                     + dpvs.validate(user));
49         } catch (Exception e) {
50             e.printStackTrace();
51         }
52 //        System.out.println(new ParameterValidatorDemo().phoneNumber("15073207380"));
53     }
54     /**
55      * 
56      * 
57      * 項目名稱:ParameterValidator 類名稱: User 類描述: your entity 創建人: HumorChen
58      * 創建時間:2019年4月20日 下午10:31:51 修改時間:2019年4月20日 下午10:31:51 修改備註:
59      * 
60      */
61 
62 }
63 
64 class User {
65     private String phoneNumber;
66     private String password;
67 
68     public String getPhoneNumber() {
69         return phoneNumber;
70     }
71 
72     public void setPhoneNumber(String phoneNumber) {
73         this.phoneNumber = phoneNumber;
74     }
75 
76     public String getPassword() {
77         return password;
78     }
79 
80     public void setPassword(String password) {
81         this.password = password;
82     }
83     public String toString()
84     {
85         return "phoneNumber:"+phoneNumber+"\npassword:"+password+"\n";
86     }
87 }
View Code

示範調用類運行結果:

DefaultParameterValidateService initialize success
phoneNumber:15073207380
password:12345678ABC
validate result: SUCCESS
phoneNumber:1507320738
password:12345678ABC
validate result: illegal phone number
phoneNumber:1507320738
password:12345
validate result: illegal phone number
phoneNumber:1507320738
password:12345
validate result: illegal phone number
illegal password

附:

該套HTTP請求參數驗證器服務ParamertValidateService,只需要寫一個參數驗證器的類,該類中為每個需要驗證的參數寫個同名方法(參數為Object object),在方法內寫自己的驗證邏輯,驗證通過則返回ParameterValidateService.SUCCESS,否則返回自定義錯誤提示,可選擇單錯誤提示模式和全錯誤提示模式,單錯誤提示模式下當驗證器發現參數不合法時會立馬將該錯誤返回,而全錯誤模式下會驗證完所有參數後,將所有錯誤原因返回(以DefaultParameterValidateService.ReasonSeparator分隔,可自定義)。調用該服務時只需要這樣寫DefaultParameterValidateService.validate(POJO pojo);即可對pojo內所有屬性進行驗證,並將結果返回。所有參數驗證全部通過則返回ParameterValidateService.SUCCESS,否則返回錯誤提示。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • inside the <body> tags, using a "wrapper" div to control the whole section. HTML: <div id="wrapper"> (content) </div> CSS: #wrapper { ... margin: 0 au ...
  • **Git安裝以及常用命令** 1、下載安裝Git,傻瓜式安裝相信大家都會。 官網下載地址:[https://git-scm.com/downloads] 2、Git基本操作 (1)git --version(查看git版本) (2)git --help(輔助命令查看) (3) git config ...
  • 通過這張圖我們很明顯就可以看出了區別: 普通函數調用的時候this的指向是window 而構造函數調用的時候this的指向是這個對象 列印結果是:凡塵 18 為什麼會是一個false呢???如果你聽過凡塵老師講課的話,在ES6的一張說過一道面試題。 創建構造函數的時候js執行了那些操作? 1、在記憶體 ...
  • 一、Express框架 1.1基本使用 創建http伺服器特別麻煩,express框架解決了這個的問題。 Express在node界的地位,就相當於jQuery在DOM界的地位。jQuery的核心就是“批量”,1個jQuery對象中可以封裝多個原生對象。Express的核心就是中間件,Express ...
  • 介紹 Vue.js + Nuxt.js 項目中如何使用、自定義錯誤信息、自定義規則 Vee-validate 校驗表單 ...
  • 在寫單文件組件時,一般都是把標簽、腳本、樣式寫到一起,這樣寫個人感覺有點不夠簡潔,所以就想著把樣式分離出去。 採用import載入樣式 在局部作用域(scoped)採用@import載入進來的樣式文件,想法是美好的。以為這樣載入進來的樣式文件也只對當前組件有效;可現實是殘酷的,這樣載入進來的樣式無法 ...
  • 一、路由機制(靜態資源文件處理) 1.1 Nodejs沒有根目錄 MIME類型:http://www.w3school.com.cn/media/media_mimeref.asp 在Apache中,它會自動將htdocs文件夾提供靜態化路由服務。 但是Nodejs沒有這個機制。 在文件夾中創建這樣 ...
  • 在單頁面應用程式(SPA)中,有些頁面的佈局結構是上下兩塊是固定,中間內容是變化的。這時在入口處固定上下部分就可以很好的解決這一問題。有少部分頁面沒有上下部分或不需要(如:用戶註冊、登陸頁面),針對這一情況怎麼解決 相容這兩種情況解決方案: App.vue 在入口處單個路由輸出 Frame.vue ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...