前端代码实现
# 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 + '×tamp=' + 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;
}