前端JSON请求统一校验

作者: 慕凌峰 | 来源:发表于2017-05-09 09:02 被阅读264次

一、ParamCheckValidate 参数验证

此例是通过SpringMVC从前台获取Map格式的json后,调用Message()方法,来判断传入的参数是否为空,以及基本格式是否正确,如:手机号码、密码等,但前提是你必须在BaseConstants 中配置你要传入的参数

package com.yhb.validate;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import com.google.common.collect.Maps;
import com.yhb.base.BaseConstants;
import com.yhb.enums.ResultEnum;
import com.yhb.util.CheckPhoneOrPassWord;
import com.yhb.util.StringUtil;
import com.yhb.util.json.JsonResult;

/**
 * Copyright: Copyright (c) 2017 LanRu-Caifu
 * 
 * @ClassName: ParamCheckValidate.java
 * @Description: 参数验证
 * @date: 2017年5月5日 上午11:00:10
 */
public class ParamCheckValidate {

    private static String keyName;

    private static String value;

    /**
     * 
     * @Description:校验入参
     *
     * @param:param
     * @return:Json OR Boolean
     * @date: 2017年5月5日 上午11:31:53
     */
    public static Map<String, String> Message(Map<String, String> param) {
        Map<String, String> returnMap = Maps.newHashMap();
        List<String> paramList = new ArrayList<String>();
        // 遍历Map集合获取KeyName
        for (String keyNames : param.keySet()) {
            if (!keyNames.equals("JSESSIONID") && !keyNames.equals("inviteCode")) {
                keyName = keyNames;
                paramList.add(keyName);
            }
        }
        // 遍历List取出KeyName对象
        for (String string : paramList) {
            // KeyName对象存在于该集合里,则进入判断否则返回状态
            if (BaseConstants.VALIDATEKEY_MAP.containsKey(string)) {
                // 取出相对应的值
                value = param.get(string);
                if (StringUtil.isNull(value) || StringUtil.isBlank(value)) {

                    if (string.equals("account")) {
                        if (CheckPhoneOrPassWord.isMobileNum(param.get(string)) == false) {
                            returnMap.put(String.valueOf(ResultEnum.LOGIN_FORMISFLAG.getCode()),
                                    ResultEnum.LOGIN_FORMISFLAG.getCodeDesc());
                            return returnMap;
                        }
                    }

                    if (string.equals("password")) {
                        if (CheckPhoneOrPassWord.isPassword(param.get(string)) == false) {
                            returnMap.put(String.valueOf(ResultEnum.LOGIN_FORMISFLAG.getCode()),
                                    ResultEnum.LOGIN_FORMISFLAG.getCodeDesc());
                            return returnMap;
                        }
                    }
                    // 如果当前value为空,那么当前KeyName所带参数就一定为空,找到系统字典中所对应的Code匹配
                    if (BaseConstants.VALIDATEVALUEISNULLBYKEY.containsKey(string)) {
                        Integer enumValue = BaseConstants.VALIDATEVALUEISNULLBYKEY.get(string);

                        // 通过values()方法,将枚举里所有类型列出来
                        for (ResultEnum resultCode : ResultEnum.values()) {
                            if (resultCode.getCode() == enumValue) {
                                returnMap.put(String.valueOf(resultCode.getCode()), resultCode.getCodeDesc());
                            }
                        }
                    }
                }
            } else {
                returnMap.put(String.valueOf(ResultEnum.DICTIONARY_ERROR.getCode()),
                        ResultEnum.DICTIONARY_ERROR.getCodeDesc());
            }

        }

        return returnMap;
    }

}

二、BaseConstants 常量类

VALIDATEKEY_MAP集合用于验证前台参数是否存在于系统字典中 保证前后一致

VALIDATEVALUEISNULLBYKEY 集合是用来对应系统字典,当发生错误时,将系统字典中配置ResultEnum 的信息输出

package com.yhb.base;

import java.util.HashMap;
import java.util.Map;

/**
 * 
 * Copyright: Copyright (c) 2017 LanRu-Caifu
 * 
 * @ClassName: BaseConstants.java
 * @Description: 全局常量
 * @date: 2017年4月27日 下午1:52:27
 */
public class BaseConstants {

    /**
     * 常量
     * 
     * @author KRx
     */
    public interface Token {
        public final static String TOKEN_NAME = "token";
    }

    /**
     * PC来源
     */
    public static final String PC = "PC";
    /**
     * H5来源
     */
    public static final String H5 = "H5";
    /**
     * APP来源
     */
    public static final String APP = "APP";
    /**
     * WEIXIN
     */
    public static final String WEIXIN = "微信";
    /**
     * OTHER
     */
    public static final String OTHER = "其他";

    /**
     * UTF-8编码
     */
    public static final String UTF8 = "UTF-8";
    /**
     * 提示信息
     */
    public static final String MESSAGE = "message";
    /**
     * cookie中的JSESSIONID名称
     */
    public static final String JSESSION_COOKIE = "JSESSIONID";
    /**
     * url中的jsessionid名称
     */
    public static final String JSESSION_URL = "jsessionid";
    /**
     * 附件路径
     */
    public static final String FILEPATH = "files";
    /**
     * HTTP POST请求
     */
    public static final String POST = "POST";
    /**
     * HTTP GET请求
     */
    public static final String GET = "GET";

    public static final String DES_PUBLIC_ENCRYPT_KEY = "6Ta4OaHZdpA="; // DES加密key
    // IV
    public static final String DES_PRIVATE_ENCRYPT_KEY = "o0al4OaEWBzA1";
    /** app加密key值 **/
    public static final String DES_PUBLIC_KEY_IOS_ANDROID = "0123456789lbsoft";

    // 验证前台参数是否存在于系统字典中 保证前后一致
    public static Map<String, String> VALIDATEKEY_MAP = new HashMap<String, String>();

    // 对应系统字典
    public static Map<String, Integer> VALIDATEVALUEISNULLBYKEY = new HashMap<String, Integer>();

    static {
        VALIDATEKEY_MAP.put("account", "account");          //账号
        VALIDATEKEY_MAP.put("password", "password");        //密码
        VALIDATEKEY_MAP.put("phoneCode", "phoneCode");      //手机验证码
        VALIDATEKEY_MAP.put("picCode", "picCode");          //图文验证码
        VALIDATEKEY_MAP.put("state", "state");              //发送短信的类型
        VALIDATEKEY_MAP.put("smsContext", "smsContext");    //发送的短信信息
        
        VALIDATEVALUEISNULLBYKEY.put("acccount",-1);        //手机号码
        VALIDATEVALUEISNULLBYKEY.put("password",-5);        //密码
        VALIDATEVALUEISNULLBYKEY.put("phoneCode", -7);      //手机验证码
        VALIDATEVALUEISNULLBYKEY.put("picCode", -8);        //图文验证码
        VALIDATEVALUEISNULLBYKEY.put("state", -100);        //发送短信的类型 
        VALIDATEVALUEISNULLBYKEY.put("smsContext", -101);   //发送的短信信息

    }

}

3、ResultEnum

系统字典,此处只是一些简单的测试配置

/**
 * 
 */
package com.yhb.enums;

/**
 * Copyright: Copyright (c) 2017 LanRu-Caifu
 * 
 * @ClassName: ResultEnum.java
 * @Description: 系统错误常量字典
 * @date: 2017年4月27日 下午3:20:07
 */
public enum ResultEnum {
    
    USERNAME_ISNULL(-1,"密码为空"),
    
    PASSWORD_ISERROR(-2,"密码错误"),
    
    USER_ISNULL(-3,"没有该账号"),
    
    LOGIN_FORMISFLAG(-4,"登录账号或密码格式错误"),
    
    PASSWORD_ISNULL(-5,"密码为空"),
    
    CAPTCHA_ISERROR(-6,"验证码错误"),
    
    PHONECODE_ISNULL(-7,"手机验证码为空"),
    
    PICCODE_ISNULL(-8,"图文验证码为空"),
    
    PHONECODE_ISERROR(-9,"手机验证码错误"),
    
    PICCODE_ISERROR(-10,"图文验证码错误"),
    // 手机号码已存在
    PHONECODE_ISEXIT(-11,"手机号码已存在"),
    
    TOKEN_ISNULL(-12,"token为空"),
    // 黑名单用户
    BLACK_USER(-13,"黑名单用户"),
    
    IMAGE_ISBIG(-14,"上传图片过大"),
    
    ERROR(-500, "系统错误"),
    
    DICTIONARY_ERROR(-501,"字典错误,传入的参数中有不合法参数"),
    
    SUCCESS(200,"成功"),
    /*
     * 大汉三通的信息字典——短信发送:wangxf
     */
    // 大汉三通-发送短信:用户被禁发或禁用(格式,范围等不符合要求)
    PARAM_ERROR(19,"用户被禁发或禁用(格式,范围等不符合要求)"),
    // 大汉三通-发送短信:成功
    SMS_SEND_SUCCESS(0,"短信发送成功"),
    // 大汉三通-发送短信:系统正忙
    SYSTEM_BUSY(98,"系统正忙"),
    // 大汉三通-发送短信:手机号码无效
    PHONE_INVALID(1,"手机号码无效"),
    // 大汉三通-发送短信:手机号码为空
    PHONE_ISNULL(14,"手机号码为空"),
    // 大汉三通-短信发送:ip鉴权失败
    IP_AUTHENT_FAILURE(20,"ip鉴权失败"),
    
    // 短信发送的状态错误
    SMS_STATE_ERROR(-100,"发送短信类型值错误!"),
    // 短信信息为空
    SMS_CONTEXT_ISNULL(-101,"短信信息为空!")
    
    ;
    
    
    /**
     * code值
     */
    private final int code;

    /**
     * code对应的描述
     */
    private final String codeDesc;

    ResultEnum(int code, String codeDesc) {
        this.code = code;
        this.codeDesc = codeDesc;
    }

    /**
     * 获取code值
     * 
     * @return
     */
    public int getCode() {
        return code;
    }

    /**
     * 获取code值对应的描述
     * 
     * @return
     */
    public String getCodeDesc() {
        return codeDesc;
    }
    
    /**
     * 
    * @Function: ExceptionEnum.java
    * @Description: 通过枚举code值获取相应的枚举类型对象
    *
    * @param: int code
    * @return: ResultEnum
    * @throws:
    *
    * @version: v1.0.0
    * @date: 2017年5月4日 下午2:15:27 
    *
    * Modification History:
    * Date        Author          Version            Description
    *---------------------------------------------------------*
    * 2017年5月2日     wangxf           v1.0.0               修改原因
     */
    public static ResultEnum getResultEnumByCode(int code){
        
        // 通过values()方法,将枚举里所有类型列出来
        for( ResultEnum resultCode : ResultEnum.values() ){
            if( resultCode.getCode() == code){
                return resultCode;
            }
        }
        
        return null;
    }
    
}

*** 说明:这只是写的一个小demo,主在传达一种思想,如果有更好的想法,希望多多指教***

相关文章

网友评论

    本文标题:前端JSON请求统一校验

    本文链接:https://www.haomeiwen.com/subject/xjemtxtx.html