前端存放token

1、可以将token存储在 localstorage里面,在一个统一的地方复写请求头,让每次请求都在header中带上这个token, 当token失效的时候,后端肯定会返回401,这个时候在你可以在前端代码中操作返回登陆页面,清除localstorage中的token就好。

2、Storage的localStorage长期有效,sessionStorage关闭浏览器时会自动清除

3、vue存放token:http://www.php.cn/js-tutorial-385356.html

4、vue存放token:   https://segmentfault.com/q/1010000007624160

 

 

 

 

 

### 如何在前端页面中正确设置和管理 Token #### 设置 Token 的方法 Token 可以通过多种方式存储在前端环境中,常见的有 Cookie 和 Web Storage (localStorage 或 sessionStorage)[^1]。 对于 JWT Token 来说,将其存放在 Web Storage 中是一种常见做法,尤其是在需要应对浏览器禁用 Cookie 或跨站点请求的情况下。 以下是具体实现代码示例: ```javascript // 存储 Token 到 localStorage function setTokenToLocalStorage(token) { localStorage.setItem('authToken', token); } // 获取 Token 从 localStorage function getTokenFromLocalStorage() { return localStorage.getItem('authToken'); } // 删除 Token 从 localStorage function removeTokenFromLocalStorage() { localStorage.removeItem('authToken'); } ``` 如果希望 Token 在关闭浏览器标签页后自动清除,则可以选择 `sessionStorage` 而不是 `localStorage`。 ```javascript // 使用 sessionStorage 替代 localStorage function setTokenToSessionStorage(token) { sessionStorage.setItem('authToken', token); } function getTokenFromSessionStorage() { return sessionStorage.getItem('authToken'); } function removeTokenFromSessionStorage() { sessionStorage.removeItem('authToken'); } ``` #### 解析 Token 数据 为了提取并利用 Token 中的信息(如用户 ID、角色等),可以借助第三方库 `jwt-decode` 进行解码操作[^4]。 ```javascript import jwtDecode from 'jwt-decode'; const decodeToken = (token) => { try { const decodedData = jwtDecode(token); console.log(decodedData); // 输出 Token 中的有效载荷数据 return decodedData; } catch (error) { console.error('Token 解码失败:', error.message); return null; } }; ``` #### 自动刷新 Token 的机制 为了避免因 Token 过期而导致用户频繁重新登录的情况,通常会引入 Refresh Token 机制来动态更新 Access Token[^3]。以下是一个基于方式一的简单实现流程: 1. **拦截 HTTP 请求**:当发现 Access Token 已过期时触发 Refresh Token 流程。 2. **调用 Refresh API**:向服务器发送 Refresh Token 并获取新的 Access Token。 3. **替换旧 Token**:将新获得的 Access Token 更新至存储位置。 下面是 Vue.js 环境中的 Axios 拦截器配置实例: ```javascript import axios from 'axios'; import jwtDecode from 'jwt-decode'; let isRefreshing = false; // 避免重复刷新标志位 let refreshSubscribers = []; // 订阅者列表 async function refreshToken() { const refresh_token = localStorage.getItem('refreshToken'); // 假设已保存 Refresh Token if (!refresh_token) throw new Error('Refresh Token 缺失'); try { const response = await axios.post('/api/auth/refresh-token', { refresh_token }); const access_token = response.data.access_token; // 更新 Local Storage 中的 Access Token localStorage.setItem('authToken', access_token); // 执行订阅者的回调函数 refreshSubscribers.forEach(callback => callback(access_token)); refreshSubscribers = []; return Promise.resolve(); } catch (error) { return Promise.reject(error); } } export default function setupInterceptors(instance, authHeaderName = 'Authorization') { instance.interceptors.request.use(config => { const token = localStorage.getItem('authToken'); if (token && config.headers) { config.headers[authHeaderName] = `Bearer ${token}`; } return config; }, error => Promise.reject(error)); instance.interceptors.response.use(response => response, async error => { const originalRequest = error.config; if (error.response.status === 401 && !originalRequest._retry) { originalRequest._retry = true; if (!isRefreshing) { isRefreshing = true; try { await refreshToken(); // 刷新 Token } finally { isRefreshing = false; } } return instance(originalRequest); // 重试原始请求 } return Promise.reject(error); }); return instance; } ``` 上述代码实现了对未授权错误 (`401`) 的捕获以及 Token 刷新逻辑的自动化处理。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值