今天配了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 } } }
浙公网安备 33010602011771号