欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

自研后端HTTP请求参数验证器服务ParamertValidateService

程序员文章站 2022-11-27 15:59:11
好处:方便了后端对HTTP请求中参数进行核验,只需一次编写效验器,一行代码便可对所有参数的pojo进行参数核验!而且更改效验逻辑时只需要更改效验器类即可,实现了解耦合。 只需要程序员按照规范开发一个ParameterValidator类(如下图1),将所有效验方法写在该类中即可在任意地方使用一行代码 ......

好处:方便了后端对http请求中参数进行核验,只需一次编写效验器,一行代码便可对所有参数的pojo进行参数核验!而且更改效验逻辑时只需要更改效验器类即可,实现了解耦合。

只需要程序员按照规范开发一个parametervalidator类(如下图1),将所有效验方法写在该类中即可在任意地方使用一行代码实现对所有参数的核验(如下图2)

图1:(图中写了对手机号码和密码进行核验的方法)

自研后端HTTP请求参数验证器服务ParamertValidateService

 

图二:

自研后端HTTP请求参数验证器服务ParamertValidateService

 


jar包:parametervalidator.jar

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

项目结构:

自研后端HTTP请求参数验证器服务ParamertValidateService

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 }

默认实现类: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 }

示范包:

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 }

示范调用类:

 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 }

示范调用类运行结果:

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,否则返回错误提示。