簡單易用的參數校驗北京PK10平臺出租和版本校驗方式(java)
我的項目中使用的MVC框架為Jfinal框架,其他框架也適用只需要將攔截器部分修改即可
使用方式非常簡單,使用方式:
1.在controller層加上
校驗參數//註冊保存的校驗組:VGroup.save
@Validator(bean=Register.class,group=VGroup.save)
br/>//註冊保存的校驗組:VGroup.save
@Validator(bean=Register.class,group=VGroup.save)
校驗接口版本號
@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 = "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)