vue 封装 axios 并使用 aes 对请求响应数据加解密

// 前端通过AES进行加解密(CBC模式)

npm install crypto-js --save-dev

1、新建文件 AESED.js

import CryptoJS from "crypto-js";

let key = CryptoJS.enc.Utf8.parse('P@S5W0rDK3yBACHU'); // 密钥:一个常量,前后端协定后一个字符串即可

let iv = CryptoJS.enc.Utf8.parse('ABCDEF1234123412'); // 偏移量:一个常量,前后端协定后一个字符串,前后端一致即可

//解密方法

function Decrypt(word) {

    // 删除字符串中的空格

    let strs = word.replace(/\ +/g, "");

    // 删除字符串中的换行符

    let words = strs.replace(/[\r\n]/g, "")

    var encryptedHexStr = CryptoJS.enc.Base64.parse(words);

    var srcs = CryptoJS.enc.Base64.stringify(encryptedHexStr);

    var decrypt = CryptoJS.AES.decrypt(srcs, key, {

        iv: iv,

        mode: CryptoJS.mode.CBC,

        padding: CryptoJS.pad.Pkcs7

    });

   

    var decryptedStr = decrypt.toString(CryptoJS.enc.Utf8);

    return decryptedStr.toString();

}

//加密方法

function Encrypt(word) {

    var srcs = CryptoJS.enc.Utf8.parse(word);

    var encrypted = CryptoJS.AES.encrypt(srcs, key, {

        iv: iv,

        mode: CryptoJS.mode.CBC,

        padding: CryptoJS.pad.Pkcs7

    });

    return CryptoJS.enc.Base64.stringify(encrypted.ciphertext);

}

//暴露接口

export default {

    Decrypt,

    Encrypt

}

2、新建request.js

import axios from 'axios';

// 引入 AESED.js

import Aes from "@/utils/AESED"

const baseAesFlag = false //是否开启aes加密

axios.defaults.headers['Content-Type'] = 'application/json;charset=utf-8';

// 创建axios实例

const service = axios.create({

    // axios中请求配置有baseURL选项,表示请求URL公共部分

    baseURL: process.env.VUE_APP_BASE_API,

    // 超时

    timeout: 10000

})

// 请求拦截器

service.interceptors.request.use(function(config) {

    // 在发送请求之前做些什么

   if (baseAesFlag) {

            // 请求参数加密

              config.data = Aes.Encrypt(JSON.stringify(config.data))

    }

    return config;

}, function(error) {

    // 对请求错误做些什么

    return Promise.reject(error);

});

// 响应拦截器

service.interceptors.response.use(function(response) {

    // 2xx 范围内的状态码都会触发该函数。

    // 对响应数据做点什么

       let data = response.data

       if (baseAesFlag) {

              // 对响应数据解密

              data = JSON.parse(Aes.Decrypt(data))

       }

    return data;

}, function(error) {

    // 超出 2xx 范围的状态码都会触发该函数。

    // 对响应错误做点什么

    if(error && error.response) {

        const status = error.response.status

        switch(status) {

            case 400:

                break;

            case 401:

                break;

            case 403:

                break;

            case 404:

                break;

            case 408:

                break;

            case 500:

                break;

            case 501:

                break;

            case 502:

                break;

            case 503:

                break;

            case 504:

                break;

            default:

                console.log('服务器端出错!');

        }

    }else {

       

    }

    return Promise.reject(error);

});

export default service;

  • 11
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue使用axios进行网络请求是非常常见的。我们可以对axios进行封装来方便地在Vue使用。这里提供一个例子,包括axios的安装、请求拦截器、设置请求超时时间以及post请求头的设置。 首先,我们需要安装axios,可以通过npm install axios命令来进行安装。后,我们可以在Vue项目中的main.js文件中引入axios,并且将其挂载到Vue原型上,这样在组件中就可以通过this.$http来进行访问。接下来,我们可以封装一个request函数,封装axios请求拦截器、设置请求超时时间以及post请求头的设置。 下面是一个简单的封装axios请求的例子: 1. 安装axios ``` npm install axios ``` 2. 在main.js中引入axios并挂载到Vue原型上 ``` import axios from 'axios' Vue.prototype.$http = axios ``` 3. 封装request函数 ``` import axios from 'axios' import store from '@/store/index' // 创建axios实例 const service = axios.create({ timeout: 10000 // 请求超时时间 }) // 请求拦截器 service.interceptors.request.use( config => { // 每次发送请求之前判断vuex中是否存在token // 如果存在,则统一在http请求的header都加上token,这样后台根据token判断你的登录情况 // 即使本地存在token,也有可能token是过期的,所以在响应拦截器中要对返回状态进行判断 const token = store.state.token token && (config.headers.Authorization = token) return config }, error => { return Promise.error(error) } ) // 响应拦截器 service.interceptors.response.use( response => { // 如果返回的状态码为200,说明接口请求成功,可以正常拿到数据 // 否则的话抛出错误 if (response.status === 200) { return Promise.resolve(response.data) } else { return Promise.reject(response) } }, error => { // 服务器返回不是 2 开头的情况,会进入这个回调 // 可以根据后台返回的状态码进行不同的操作 if (error.response.status) { switch (error.response.status) { // 401: 未登录 // 未登录则跳转登录页面,并携带当前页面的路径 // 在登录成功后返回当前页面,这一步需要在登录页操作。 case 401: router.replace({ path: '/login', query: { redirect: router.currentRoute.fullPath } }) break // 403 token过期 // 登录过期对用户进行提示 // 清除本地token和清空vuex中token对象 // 跳转登录页面 case 403: Toast({ message: '登录过期,请重新登录', duration: 1000, forbidClick: true }) // 清除token localStorage.removeItem('token') store.commit('loginSuccess', null) // 跳转登录页面,并将要浏览的页面fullPath传过去,登录成功后跳转需要访问的页面 setTimeout(() => { router.replace({ path: '/login', query: { redirect: router.currentRoute.fullPath } }) }, 1000) break // 404请求不存在 case 404: Toast({ message: '网络请求不存在', duration: 1500, forbidClick: true }) break // 其他错误,直接抛出错误提示 default: Toast({ message: error.response.data.message, duration: 1500, forbidClick: true }) } return Promise.reject(error.response) } } ) export default service ``` 4. 在组件中使用request函数 ``` import request from '@/utils/request' // 发送get请求 request.get(url, params).then(res => { console.log(res) }).catch(err => { console.log(err) }) // 发送post请求 request.post(url, data).then(res => { console.log(res) }).catch(err => { console.log(err) }) ``` --相关问题--:

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值