1. 程式人生 > >簡單易用的參數校驗北京PK10平臺出租和版本校驗方式(java)

簡單易用的參數校驗北京PK10平臺出租和版本校驗方式(java)

else runtime boot java pri conf utils 短信 con

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

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

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

1.在controller層加上

校驗參數//註冊保存的校驗組:VGroup.save
@Validator(bean=Register.class,group=VGroup.save)
br/>//註冊保存的校驗組:VGroup.save
@Validator(bean=Register.class,group=VGroup.save)

@Validator(bean=Register.class,group=VGroup.excutor)

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

2.配置攔截器:@Override
br/>@Override
interceptors.add(new ValidatorInterceptor());
}

3.在不同的實體類上配置校驗規則:@VRules(rules={
br/>@VRules(rules={
@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
    br/>*/
    @Documented
    br/>@Inherited
    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
    br/>*/
    @Documented
    br/>@Inherited
    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
    br/>*/
    @Documented
    br/>@Inherited
    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
    br/>*/
    @Documented
    br/>@Inherited
    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));
}
}
}

}

簡單易用的參數校驗北京PK10平臺出租和版本校驗方式(java)