今天配了JWT验证,已经加密登录所需要存入的缓存

import axios from 'axios'
import router from '@/router'
import { Message } from 'element-ui'
import crypto from '@/utils/crypto'

// 请求拦截器
axios.interceptors.request.use(
    config => {
        const token = sessionStorage.getItem('token');
        if (token) {
            try {
                const decryptedToken = crypto.decrypt(token);
                if (decryptedToken) {
                    config.headers['Authorization'] = `Bearer ${decryptedToken}`;
                }
            } catch (error) {
                console.error('Token解密失败:', error);
                // Token解密失败,清除无效token
                sessionStorage.removeItem('token');
                sessionStorage.removeItem('CURRENT_USER');
                if (router.currentRoute.path !== '/') {
                    router.replace('/');
                }
                Message.error('登录已过期,请重新登录');
            }
        }
        return config;
    },
    error => {
        return Promise.reject(error);
    }
);

// 响应拦截器
axios.interceptors.response.use(
    response => {
        return response;
    },
    error => {
        if (error.response) {
            switch (error.response.status) {
                case 401:
                    // token过期或无效
                    sessionStorage.removeItem('token');
                    sessionStorage.removeItem('CURRENT_USER');
                    // 使用 replace 而不是 push
                    if (router.currentRoute.path !== '/') {
                        router.replace('/').catch(err => {
                            if (err.name !== 'NavigationDuplicated') {
                                throw err;
                            }
                        });
                    }
                    Message.error('登录已过期,请重新登录');
                    break;
                default:
                    Message.error(error.response.data.msg || '请求失败');
            }
        }
        return Promise.reject(error);
    }
);

// 路由导航错误处理
router.onError((err) => {
    if (err.name === 'NavigationDuplicated') {
        // 忽略重复导航错误
        return;
    }
    throw err;
});

export default axios;
import CryptoJS from 'crypto-js'

const SECRET_KEY = 'your-secret-key-123' // 加密密钥,建议使用复杂的随机字符串

export default {
  // 加密方法
  encrypt(data) {
    if (typeof data === 'object') {
      data = JSON.stringify(data)
    }
    return CryptoJS.AES.encrypt(data, SECRET_KEY).toString()
  },

  // 解密方法
  decrypt(encryptedData) {
    try {
      const bytes = CryptoJS.AES.decrypt(encryptedData, SECRET_KEY)
      const decryptedData = bytes.toString(CryptoJS.enc.Utf8)
      try {
        return JSON.parse(decryptedData)
      } catch {
        return decryptedData
      }
    } catch {
      return null
    }
  }
} 

 

posted on 2025-01-12 16:19  许七安gyg  阅读(2)  评论(0)    收藏  举报