vue开发axios请求 用SM2加密,解密

  1 import axios from "axios";
  2 import { Message } from 'element-ui'
  3 // 地址
  4 // let baseUrl = 'http://'
  5 let username = 'sesp1'
  6 //加解密开关
  7 window.ENCRYPT=false
  8 /*公钥*/
  9 var publicKey="";
 10 /*私钥*/
 11 var privateKey=""
 12 
 13 /*分割字符串*/
 14 function splitStr (str) {
 15     var len = Math.ceil(str.length / 500)
 16     var arr = Array(len)
 17     var i = 0
 18     for (; i < len; i++) {
 19         // console.log('index: %s, len: %s, str: %s', i, len, str.length)
 20         arr[i] = str.substring(0, 500)
 21         if (i < len) {
 22             str = str.substring(500, str.length)
 23         }
 24     }
 25     return arr
 26 }
 27 /**
 28  * SM2加密
 29  */
 30 function encryptSM2 (word) {
 31 
 32     var str = btoa(encodeURIComponent(JSON.stringify(word)))
 33     var arrStr = splitStr(str).map(s => window.SG_sm2Encrypt(s, publicKey))
 34     return arrStr.join('|')
 35 }
 36 
 37 /**
 38  * SM3哈希
 39  */
 40  function encryptSM3 (word) {
 41     return window.SG_sm3encrypt(word)
 42 }
 43 /**
 44  * SM2解密
 45  */
 46 function decryptSM2$$2 (word) {
 47     var strs = word.split('|').map(s => window.SG_sm2Decrypt(s, privateKey))
 48     var json=JSON.parse(decodeURIComponent(atob(strs.join(''))))
 49     return json
 50 }
 51 
 52 const service = axios.create({
 53     baseURL: baseUrl, // api 的 base_url
 54 
 55 });
 56 
 57 
 58 //1.添加请求拦截器
 59 service.interceptors.request.use((config) => {
 60     config.url = config.baseURL + config.url;
 61     if (config.data.username && config.data.username == 'sesp1') {
 62         config.data.username = username
 63     }
 64     //请求数据
 65     let baseParams=config.data;
 66     // console.log("基本参数",baseParams)
 67     let savelogParams={};
 68     // console.log("埋点参数",savelogParams)
 69 
 70     //headers封装
 71     config.headers={
 72         y:new Date().getTime(),
 73     };
 74     //埋點加密參數  注:SM3后面的参数是集成参数
 75     let secSavelogParams=window.ENCRYPT?encryptSM2(savelogParams):savelogParams
 76 
 77     if(window.ENCRYPT){
 78       config.data={
 79         iespsm:encryptSM2(baseParams),
 80         timestamp:new Date().getTime()
 81       };
 82       config.headers["SignSM3"]=encryptSM3(JSON.stringify(config.data)+secSavelogParams)
 83     }
 84     config.headers["buried"]=(window.ENCRYPT)?secSavelogParams:encodeURIComponent(JSON.stringify(savelogParams))
 85       if (window.sessionStorage.getItem("JWT")) {
 86           config.headers.Authorization = window.sessionStorage.getItem("JWT")
 87       }
 88     return config;
 89     }, (error) => {
 90     Message({
 91         showClose: true,
 92         message: '网络错误,请稍后重试!',
 93         type: "warning"
 94     });
 95     return Promise.reject(error);
 96 });
 97 //2.添加响应拦截器
 98 service.interceptors.response.use((res) => {
 99     if(window.ENCRYPT){
100         /*判断解密*/
101         if(null!=res.data.iespData&&undefined!=res.data.iespData){
102             res.data=decryptSM2$$2(res.data.iespData)
103         }    
104     }
105     // console.log("响应数据",res) 
106     return res;
107 }, (error) => {
108     Message({
109         showClose: true,
110         message: '网络错误,请稍后重试!',
111         type: "warning"
112     });
113     return Promise.reject(error);
114 });
115 
116 
117 export default service;

在main.js中引入sm.js;静态文件注入需放在public下的static目录下

原文地址:https://www.cnblogs.com/ting-0424/p/13566008.html