前端代码实现

# VUE版本 ### 一、嵌入拦截器 service.interceptors.request.use( config => { if (getToken()) { config.headers['X-Token'] = getToken() // 让每个请求携带自定义token 请根据实际情况自行修改 } if (config.url == '/auth/user/login') { return config } if (config.method === 'post' || config.method === 'patch') { console.log(config) let data = config.data if(typeof data=='object' && data.constructor==Array){ data = { data:config.data } } for (let k in data) { if (data[k] === undefined || data[k] === null) { delete data[k] } } data.timestamp = (new Date()).getTime().toString(); data.sign = enedSign(data, VUE_APP_KEY, config.method) config.headers['X-Sign'] = data.sign config.headers['X-Timestamp'] = data.timestamp } else { let params = config.params || { timestamp: null } for (let k in params) { if (params[k] === undefined || params[k] === null || params[k] === '') { delete params[k] } } params['timestamp'] = new Date().getTime().toString(); let sign = enedSign(params, VUE_APP_KEY, config.method) if (config.params) { config.url = config.url + '?sign=' + sign } else { config.url = config.url + '?sign=' + sign + '&timestamp=' + params['timestamp'] } } return config }, error => { Promise.reject(error) } ) ### 二、 相关代码依赖 // param 请求对象, appKey密钥 export function enedSign(param, appKey, method) { //将十六进制编码的密文字符串转换为密码params对象。` let key = CryptoJS.enc.Utf8.parse(appKey); //将十六进制编码的密文字符串转换为密码params对象。 if (param.sign) { delete param.sign } console.log(param) //对象用“,”隔开,字段之前用"&"隔开 let content = CryptoJS.enc.Utf8.parse(sortJoin(param, "&")); console.log(sortJoin(param, "&")) //生成密钥 let value = CryptoJS.HmacSHA1(content, key); //将密钥转换为Base64字符串,生成签名 let signs = CryptoJS.enc.Base64.stringify(value); console.log(signs) //处理签名中的特殊字符 if (method === 'get' || method === 'delete') { let sign = encodeURIComponent(signs) return sign; } else { return signs; } } export function sortJoin(obj, prefix) { if (obj == null) return ""; //返回对象的可枚举属性和方法的名称。 let keys = Object.keys(obj); // 比较用于确定元素顺序的函数的名称。如果省略,则按升序ASCII字符顺序对元素排序。 keys = keys.sort(); let ret = ""; for (var i = 0; i < keys.length; i++) { if (ret != "") { ret += prefix; } ret += keys[i]; ret += "="; let val = obj[keys[i]]; //判断是否为复杂对象(对象是否包含数组) if (val instanceof Array) { ret += "["; ret += sortArrayJoin(val, ","); ret += "]" } else if (val instanceof Object) { ret += "{"; ret += sortJoin(val, prefix); ret += "}" } else { ret += (val === null ? "" : val); } } return ret; } export function sortArrayJoin(arr, prefix) { if (!(arr instanceof Array)) { throw new Errror("the argument [arr] must be array."); } arr = arr.sort(); let ret = ""; for (let i = 0; i < arr.length; i++) { if (ret != "") { ret += prefix; } let val = arr[i]; if (val instanceof Array) { ret += "["; ret += sortArrayJoin(val, prefix); ret += "]" } else if (val instanceof Object) { ret += "{"; ret += sortJoin(val, "&"); ret += "}" } else { ret += (val === null ? "" : val); } } return ret; }