1. 程式人生 > >簡單易用的引數校驗和版本校驗方式(java)

簡單易用的引數校驗和版本校驗方式(java)

步驟是:配置資料校驗規則(多條)>>>>在控制器上新增校驗註解>>>>使用攔截器攔截校驗引數(獲取註解,初始化校驗規則(第一次),取出引數)

我的專案中使用的MVC框架為Jfinal框架,其他框架也適用只需要將攔截器部分修改即可

使用方式非常簡單,使用方式:

1.在controller層加上

 校驗引數
    //註冊儲存的校驗組:VGroup.save
    @Validator(bean=Register.class,group=VGroup.save)
    //註冊傳送簡訊時校驗組:VGroup.excutor
    @Validator(bean=Register.class,group=VGroup.excutor)

 校驗介面版本號
    @Version(version=1,message="請升級到最新版本")

2.配置攔截器:
    @Override
    public void onInterceptorConfig(Interceptors interceptors) {
        interceptors.add(new ValidatorInterceptor());
    }

3.在不同的實體類上配置校驗規則:
    @VRules(rules={
        @VRule(attrName = "mobilePhone", message="手機號碼有誤", groups = { VGroup.save,VGroup.excutor },  types = { VType.mobilePhone } ),
        @VRule(attrName = "password", message="密碼最少為6位字元",  groups = { VGroup.save },  types = { VType.password } ),
        @VRule(attrName = "verifyCode", message="驗證碼有誤",  groups = { VGroup.excutor },  types = { VType.number } ),
        @VRule(attrName = "messageId", message="驗證碼標識有誤",  groups = { VGroup.excutor },  types = { VType.notnull } )
    })
    public class Register implements Serializable{}

具體實現

/**
 * ------------------------------
 * 資料驗證規則
 * ------------------------------
 * @author wdm([email protected])  @date 2018年5月30日
 * @version 1.0
 */
public interface IVRule {
    /**
     * 校驗規則
     */
    public static final Map<String,List<ValidatorRule>> BEAN_VALIDATOT_RULE=new HashMap<String,List<ValidatorRule>>();
    /**
     * 是否初始化校驗規則
     */
    public static final Map<String,Boolean> IS_INIT_VALIDATOT_RULE=new HashMap<String,Boolean>();
}
/**<pre>
 * ------------------------------
 * 用於controller層需要驗證資料較多時的驗證
 * 預設VGroup=VGroup.excutor
 * 預設VRenderType=VRenderType.json
 * ------------------------------
 * </pre>
 * @author wdm(
[email protected]
)  @date 2018年5月30日  * @version 1.0  */ @Documented @Target(ElementType.METHOD) @Inherited @Retention(RetentionPolicy.RUNTIME) public @interface Validator {     VGroup group() default VGroup.excutor;     Class<?> bean();     String beanName() default "";     String uri() default "";     VRenderType render()  default VRenderType.json; }
/**
 * ------------------------------
 * 用於controller層驗證版本號
 * ------------------------------
 * @author wdm([email protected])  @date 2018年5月30日
 * @version 1.0
 */
@Documented
@Target(ElementType.METHOD)
@Inherited
@Retention(RetentionPolicy.RUNTIME)
public @interface Version {
    String message();
    int version();
}
package com.www.mall.common.validator;

public enum VRenderType {
    json,redirect,render
}
/**
 * ------------------------------
 * 配置一條校驗規則
 * ------------------------------
 * @author wdm([email protected])  @date 2018年7月31日
 * @version 1.0
 */
@Documented
@Target(ElementType.METHOD)
@Inherited
@Retention(RetentionPolicy.RUNTIME)
public @interface VRule {
    VGroup[] groups() default {VGroup.excutor};
    VType[] types();
    String attrName();
    String message() default "引數錯誤";
}
/**
 * ------------------------------
 * 校驗規則
 * ------------------------------
 * @author wdm([email protected])  @date 2018年7月31日
 * @version 1.0
 */
@Documented
@Target(ElementType.TYPE)
@Inherited
@Retention(RetentionPolicy.RUNTIME)
public @interface VRules {
    VRule[] rules();
}
/**
 * ------------------------------
 * 驗證資料型別
 * ------------------------------
 * @author wdm([email protected])  @date 2018年5月30日
 * @version 1.0
 */
public enum VType {
    /**非空驗證**/
    notnull,
    /**非空時驗證電子郵箱格式,空表示通過**/
    ne_email,
    /**非空時驗證身份證格式,空表示通過**/    
    ne_idcard,
    
    /**驗證電子郵箱格式**/
    email,
    /**驗證身份證格式**/    
    idcard,
    /**驗證日期格式**/    
    date,
    /***手機號驗證***/
    mobilePhone,
    /***密碼驗證***/
    password,    
    /***數字驗證***/
    number
}
/**
 * ------------------------------
 * 驗證資料規則
 * ------------------------------
 * @author wdm([email protected])  @date 2018年5月30日
 * @version 1.0
 */
public class ValidatorRule {

    private List<VGroup> vGroups;
    private List<VType> vTypes;
    private String validatorField;
    private String message;
    
    /**
     * 構建一個數據驗證規則
     * @param validatorField
     * @param message
     * @param vGroups
     * @param vTypes
     * @return
     */
    public static ValidatorRule bulid(String validatorField,String message,List<VGroup> vGroups,List<VType> vTypes){
        return new ValidatorRule(vGroups,vTypes,validatorField,message);
    }
    
    /**
     * 都需要驗證的資料
     * 如:save和update操作時都需要驗證這個引數
     * @param validatorGroups
     * @return
     */
    public static List<VGroup> group(VGroup... validatorGroups){
        List<VGroup> list=new ArrayList<VGroup>();
        for (int i = 0; i < validatorGroups.length; i++) {
            list.add(validatorGroups[i]);
        }
        return list;
    }
    
    /**
     * 資料的驗證型別
     * @param validatorTypes
     * @return
     */
    public static List<VType> type(VType... validatorTypes){
        List<VType> list=new ArrayList<VType>();
        for (int i = 0; i < validatorTypes.length; i++) {
            list.add(validatorTypes[i]);
        }
        return list;
    }
    
    private ValidatorRule(){}
    private ValidatorRule(List<VGroup> vGroups, List<VType> vTypes, String validatorField,
            String message) {
        super();
        this.vGroups = vGroups;
        this.vTypes = vTypes;
        this.validatorField = validatorField;
        this.message = message;
    }

    public List<VGroup> getValidatorGroups() {
        return vGroups;
    }
    public void setValidatorGroups(List<VGroup> vGroups) {
        this.vGroups = vGroups;
    }
    public List<VType> getValidatorTypes() {
        return vTypes;
    }
    public void setValidatorTypes(List<VType> vTypes) {
        this.vTypes = vTypes;
    }
    public String getValidatorField() {
        return validatorField;
    }
    public void setValidatorField(String validatorField) {
        this.validatorField = validatorField;
    }
    public String getMessage() {
        return message;
    }
    public void setMessage(String message) {
        this.message = message;
    }
    
}

資料校驗攔截器

/**
 * ------------------------------
 * 引數驗證攔截器
 * ------------------------------
 * @author wdm([email protected])  @date 2018年5月31日
 * @version 1.0
 */
public class ValidatorInterceptor implements Interceptor {
    
    @Override
    public void intercept(Invocation inv) {
        Version version=inv.getMethod().getAnnotation(Version.class);
        if(version!=null && !verifyVersion(inv, version)){
            return;
        }
        
        Validator validator = inv.getMethod().getAnnotation(Validator.class);
        if (validator != null && !validate(inv, validator)) {
            return;
        }
        inv.invoke();
    }
    
    private boolean verifyVersion(Invocation inv, Version version) {
        int vers=version.version();
        String message=StringUtils.isBlank(version.message())?"該功能已升級,如要繼續使用請升級app到最新版本":version.message();
        Controller controller=inv.getController();
        
        if(vers>-1){
            int verifyVersion = -1;
            String versionStr= controller.getHeader("version");//驗證版本號
            if(versionStr!=null){
                try {
                    verifyVersion=Integer.valueOf(versionStr);
                } catch (Exception e) {
                    //版本資訊錯誤  必須是int型別數字
                    e.printStackTrace();
                }
            }
            
            if(verifyVersion<vers){
                renderError( controller,VRenderType.json, "" ,RC.VERSION_FAIL,message);
                return false;
            }
            
        }
        return true;
    }

    /**
     * 驗證JSON格式的資料
     * @param inv
     * @param validator
     * @return
     */
    private boolean validate(Invocation inv, Validator validator) {
        VRenderType vRenderType=validator.render();
        VGroup group = validator.group();
        Controller controller=inv.getController();
        Class<?> clazz=validator.bean();
        String validatorBeanName=clazz.getName();

        //初始化校驗規則
        initValidatorRule(validatorBeanName, clazz);
        List<ValidatorRule>  list=IVRule.BEAN_VALIDATOT_RULE.get(validatorBeanName);
        
        if (list==null) {//沒有驗證規則
            return true;
        }
        
        JSONObject jsonObject= json(controller.getPara("param"),controller.getHeader("ploy"));
        String beanName=validator.beanName()+".";
        for (int i = 0; i < list.size(); i++) {//迴圈每一條資料規則
            ValidatorRule validatorRule=list.get(i);
            List<VGroup> groups = validatorRule.getValidatorGroups();
            if(groups.contains(group)){//包含分組-需要驗證該組資料
                String field=beanName+validatorRule.getValidatorField(); 
                String message=validatorRule.getMessage();
                List<VType> validatorRules=validatorRule.getValidatorTypes();
                for (int j = 0; j < validatorRules.size(); j++) {
                    VType vType=validatorRules.get(j);
                    
                    String value =jsonObject==null ?null : jsonObject.getString(field);//controller.getPara(field);
                    
                    if(!validate(vType,value)){
                        renderError(controller,vRenderType, validator.uri(),RC.PARAM_FAIL,message);
                        return false;
                    }
                }
            }
        }
        return true;
    }
    
    /**
     * 初始化驗證規則
     * @param isInit
     * @param bean
     */
    private void initValidatorRule(String validatorBeanName,Class<?> clazz) {
        Boolean isInit=IVRule.IS_INIT_VALIDATOT_RULE.get(validatorBeanName);
        if(isInit!=null && isInit){//是否已經初始化
            return;
        }
        VRules vRules=clazz.getAnnotation(VRules.class);
        if(vRules!=null){
            VRule[] rules=vRules.rules();
            if(rules.length>0){
                List<ValidatorRule> validatorRules=new ArrayList<ValidatorRule>();
                for (int i = 0; i < rules.length; i++) {
                    VRule vRule=rules[i];
                    String attrName=vRule.attrName();
                    String message=vRule.message();
                    VGroup[]  validatorGroups=vRule.groups();
                    VType[] validatorTypes=vRule.types();
                    validatorRules.add(ValidatorRule.bulid( attrName, message,ValidatorRule.group(validatorGroups), ValidatorRule.type(validatorTypes)));
                }
                IVRule.BEAN_VALIDATOT_RULE.put(validatorBeanName, validatorRules);
            }
        }
        IVRule.IS_INIT_VALIDATOT_RULE.put(validatorBeanName,true);
    }

    protected JSONObject json(String json,String ploy){
        if(Ploy.ENCRYPT.equals(ploy)){//引數解密
            json=ParamUtil.decryptParam(json);
            if(json==null){
                return null;
            }
        }
        return JSON.parseObject(json);
    }
    
    /**
     * 有需要再追加
     * @param vType
     * @param value
     * @return
     */
    private boolean validate(VType vType, String value) {
        if(vType==VType.notnull){
            return com.xiaoleilu.hutool.lang.Validator.isNotEmpty(value);
        }else if(vType==VType.email){
            return com.xiaoleilu.hutool.lang.Validator.isEmail(value);
        }else if(vType==VType.idcard){
            return IdcardUtil.isvalidCard18(value);
        }else if(vType==VType.ne_email){
            if( com.xiaoleilu.hutool.lang.Validator.isNotEmpty(value)){
                return true;
            }
            return RegexUtils.checkEmail(value);
        }else if(vType==VType.ne_idcard){
            if( com.xiaoleilu.hutool.lang.Validator.isNotEmpty(value)){
                return true;
            }
            return IdcardUtil.isvalidCard18(value);
        }else if(vType==VType.mobilePhone){
            return com.xiaoleilu.hutool.lang.Validator.isMobile(value) && value.length()==11;
        }else if(vType==VType.password){
            return value!=null && value.length()>5;
        }else if(vType==VType.number){
            return com.xiaoleilu.hutool.lang.Validator.isNumber(value);
        }
        
        return true;
    }

    private void renderError(Controller controller,VRenderType vRenderType, String redirect,RC result,String message) {
        if (controller instanceof JbootController) {
            if(vRenderType==VRenderType.json){
                controller.renderJson(Ret.paramFail(message));
            }else if(vRenderType==VRenderType.redirect){
                if(StringUtils.isNotBlank(redirect)){
                    controller.redirect(redirect);
                }
//                 ((JbootController) controller).setFlashAttr("message", message);
//                 ((JbootController) controller).setFlashAttr("result", result);
                controller.renderJson(Ret.result(result.getState(), message));
            }else if(vRenderType==VRenderType.render){
                controller.keepPara();
                if(StringUtils.isNotBlank(redirect)){
                    controller.render(redirect);
                }
//                 ((JbootController) controller).setFlashAttr("message", message);
//                 ((JbootController) controller).setFlashAttr("result", result);
                controller.renderJson(Ret.result(result.getState(), message));
            }else{
                if(StringUtils.isNotBlank(redirect)){
                    controller.redirect(redirect);
                }
                
//                 ((JbootController) controller).setFlashAttr("message", message);
//                 ((JbootController) controller).setFlashAttr("result", result);
                controller.renderJson(Ret.result(result.getState(), message));
            }
        }
    }

}

相關推薦

簡單引數本校方式java

步驟是:配置資料校驗規則(多條)>>>>在控制器上新增校驗註解>>>>使用攔截器攔截校驗引數(獲取註解,初始化校驗規則(第一次),取出引數) 我的專案中使用的MVC框架為Jfinal框架,其他框架也適用只需要將攔截器部分修改即

簡單的參數北京PK10平臺出租本校方式java

else runtime boot java pri conf utils 短信 con 步驟是:配置數據校驗規則(多條)>>>>在控制器上添加校驗註解>>>>使用攔截器攔截校驗參數(獲取註解,初始化校驗規則(第一次),取出參

爬蟲有個約會java

                                     我理解的爬蟲就是通過技術手段拿到網頁

方法過載方法覆蓋及其異同Java

方法過載(Overload) Java的方法過載,就是在類中可以建立多個方法,它們可以有相同的名字,但必須具有不同的引數,即或者是引數的個數不同,或者是引數的型別不同,又或者是引數的順序不同。呼叫方法時通過傳遞給它們的不同的引數列表來決定具體使用哪個方法。

HMAC-SHA1MD5 訊息摘要演算法java

最近專案中需要對接支付,用到HMAC-SHA1和MD5兩種加密演算法,簡單回顧一下。 一、HMAC-SHA1  HMAC是金鑰相關的雜湊運算訊息認證碼(Hash-based Message Authentication Code),HMAC運算利用雜湊演算法,以一個金鑰和

簡單談談如何提高後臺管理系統的性、可操作性人性化程度

前言 筆者從學校做兼職到工作這些年已經開發了或者參與開發了十多套後臺管理系統(後面簡稱BMS),而使用過的BMS就不計其數了。多數情況下,BMS主要面對的使用者是公司內部人員,為了節約人力成本,BMS的開發通常沒有前端工程師參與,或者前端工程師簡單參與,這樣就

Swifter.Json -- 在 .Net 平臺上的一個功能強大,簡單,穩定又不失高效能的 JSON 序列化反序列化工具。

Swifter.Json Github Wiki 在 .Net 平臺上的一個功能強大,簡單易用,穩定又不失高效能的 JSON 序列

簡單的資料倉庫,阿里雲重磅推出分析型資料庫3.0

7月31⽇,阿⾥雲PB級實時資料倉庫AnalyticDB重磅升級,推出AnalyticDB for MySQL 3.0版。 全新

簡單Powershell劫持Windows系統快捷鍵

post hot window div nbsp 快捷鍵 payload eat arguments POC: $WshShell = New-Object -comObject WScript.Shell $Shortcut = $WshShell.CreateSho

簡單的.NET免費開源RabbitMQ操作組件EasyNetQ解析

return 虛擬 void del exceptio 簡單的 ont activemq function 對於目前大多的.NET項目,其實使用的技術棧都是差不多,估計現在很少用控件開發項目的了,畢竟一大堆問題。對.NET的項目,目前比較適合的架構ASP.NET MVC,A

簡單的Apache shiro框架,以及復雜完整的springboot security安全框架

port primary 框架 testin java ron none AS 實現 Shiro是一個強大的簡單的易用的Java安全框架。 實現認證、授權、加密、會話管理 primary concerns:Authentication、Authorization、Crypt

短視訊SDK超級簡單

超級簡單易用的短視訊SDK來自RDSDK.COM。銳動天地為開發者提供短視訊編輯、視訊直播、特效、錄屏、編解碼、視訊轉換,等多種解決方案,涵蓋PC、iOS、Android多平臺。以市場為導向,不斷打磨並創新技術,在穩定性,相容性,硬體裝置效率優化上千捶百鍊。使產品技術一直處於同行業領先地位,在全國擁有眾多的使

php 一個簡單的資料庫類---Medoo

參照: https://packagist.org/packages/catfan/medoo https://medoo.in/doc php關於資料庫操作的工具類有很多, 現在介紹一種相容性較好,比較簡單,上手容易的sql類,Medoo。 對於一些小專案來說完全夠用。 使用M

判斷資料是否服從某一分佈——簡單fitdistrplus包轉發

文章轉發自https://www.cnblogs.com/ywliao/p/6297162.html 一、對資料的分佈進行初步判斷     1.1 原理         對於不同的分佈,有特定的

簡單的.NET免費開源RabbitMQ操作元件EasyNetQ解析

對於目前大多的.NET專案,其實使用的技術棧都是差不多,估計現在很少用控制元件開發專案的了,畢竟一大堆問題。對.NET的專案,目前比較適合的架構ASP.NET MVC,ASP.NET WebAPI,ORM(較多Dapper.NET或者其擴充套件,稍大一些的專案用EF等等),為了提高速度也會採

簡單的無縫滾動

要保證所用的圖片的大小是一致的 我的圖片大小是200px*100px <!DOCTYPE html> <html><head><meta charset="UTF-8"><title></title><sty

js實現簡單的上下無縫滾動效果

<!doctype html> <html> <head> <meta charset="utf-8"> <title></title> <meta name="description" content=""> &l

一個基於 .NET Core 2.0 開發的簡單的快速開發框架 - LinFx

LinFx 一個基於 .NET Core 2.0 開發的簡單易用的快速開發框架,遵循領域驅動設計(DDD)規範約束,提供實現事件驅動、事件回溯、響應式等特性的基礎設施。讓開發者享受到正真意義的面向物件設計模式來帶的美感。 LinFx.Extensions Caching、DapperExtensio

製作音樂相簿的軟體哪個好?簡單好上手,動感切換效果超吸睛

最近在朋友圈、抖音等社交平臺上很流行音樂相簿、電子相簿等形式的爆款視訊,通過以圖片視訊的形式展示,並且配上音樂、字幕和超酷炫的切換效果,一下子吸引了大家的眼球,說不定還能小火一把!正因為這些音樂相簿、電子相簿效果好,大家的需求也越來越大,很多小夥伴都會問製作音樂

MUNavigation 輕量 簡單 的導航框架

# 最簡單 最容易使用的導航框架 # MUNavigation 導航框架原理(與其它導航框架的區別) MUNavigation的原理是不直接對Navigation bar操作, 而是把navigation bar的樣式儲存在UIViewController裡, 當UIVie