当前位置: 首页 > news >正文

清徐网站建设做一个官网要多少钱

清徐网站建设,做一个官网要多少钱,tcn短网址在线生成,东莞横沥摘要: Axios 无感知刷新令牌是一种在前端应用中实现自动刷新访问令牌(access token)的技术,确保用户在进行 API 请求时不会因为令牌过期而中断操作 目录概览 XMLHttpRequestAxiosFetch APIJQuni.request注意事项: 访问…

在这里插入图片描述
摘要:

Axios 无感知刷新令牌是一种在前端应用中实现自动刷新访问令牌(access token)的技术,确保用户在进行 API 请求时不会因为令牌过期而中断操作

目录概览

    • XMLHttpRequest
    • Axios
    • Fetch API
    • JQ
    • uni.request
    • 注意事项:

  • 访问令牌(Access Token):用于访问受保护资源的凭证,通常有一定的有效期。
  • 刷新令牌(Refresh Token):用于获取新的访问令牌,当访问令牌过期时使用。

实现步骤:

  1. 设置拦截器:在 Axios的请求拦截器中添加逻辑,检查当前时间与令牌的过期时间。如果访问令牌已过期但刷新令牌仍然有效,则调用刷新令牌接口获取新的访问令牌。
  2. 更新令牌存储:一旦获得新的访问令牌,将其存储到 localStorage、Vuex 或其他状态管理工具中,以便后续请求使用新令牌。
  3. 重试原始请求:在成功刷新令牌后,重新发送被拦截的请求,此时使用新的访问令牌。

XMLHttpRequest

// 创建 XMLHttpRequest 实例
const xhr = new XMLHttpRequest();// 登录成功后保存 Token 和 Refresh Token
function onLoginSuccess(response) {localStorage.setItem('accessToken', response.data.accessToken);localStorage.setItem('refreshToken', response.data.refreshToken);
}// 发起请求的函数
function sendRequest(url, method, data) {return new Promise((resolve, reject) => {xhr.open(method, url);xhr.setRequestHeader('Authorization', `Bearer ${localStorage.getItem('accessToken')}`);xhr.onreadystatechange = function() {if (xhr.readyState === 4) {if (xhr.status === 200) {resolve(JSON.parse(xhr.responseText));} else {reject({ status: xhr.status, response: xhr.responseText });}}};if (method === 'POST' && data) {xhr.send(JSON.stringify(data));} else {xhr.send();}});
}// 刷新 Token 的函数
async function refreshToken() {const refreshToken = localStorage.getItem('refreshToken');const response = await fetch('/path/to/refresh', {method: 'POST',headers: {'Content-Type': 'application/json',},body: JSON.stringify({ refresh_token: refreshToken }),});const res = await response.json();if (res.success) {localStorage.setItem('accessToken', res.data.newAccessToken);return true; // 表示刷新成功} else {return false; // 表示刷新失败}
}// 拦截响应并处理 Token 刷新
xhr.addEventListener('readystatechange', function() {if (xhr.readyState === 4 && xhr.status === 401) {refreshToken().then(refreshed => {if (refreshed) {xhr.setRequestHeader('Authorization', `Bearer ${localStorage.getItem('accessToken')}`);xhr.send(); // 重新发送请求} else {alert('请重新登录'); // Token 刷新失败,可能需要用户重新登录}});}
});

Axios

import axios from 'axios';// 创建 Axios 实例
const apiClient = axios.create({baseURL: 'https://your-api-url.com',// 其他配置...
});// 响应拦截器
apiClient.interceptors.response.use(response => {return response;
}, error => {const { response } = error;if (response && response.status === 401) {return refreshToken().then(refreshed => {if (refreshed) {// 令牌刷新成功,重试原始请求return apiClient.request(error.config);} else {// 令牌刷新失败,可能需要用户重新登录return Promise.reject(error);}});}return Promise.reject(error);
});// 令牌刷新函数
function refreshToken() {return apiClient.post('/path/to/refresh', {// 刷新令牌所需的参数,例如 refresh_token}).then(response => {if (response.data.success) {// 假设响应数据中包含新的访问令牌const newAccessToken = response.data.newAccessToken;// 更新令牌存储localStorage.setItem('accessToken', newAccessToken);// 更新 Axios 实例的 headers,以便后续请求使用新令牌apiClient.defaults.headers.common['Authorization'] = `Bearer ${newAccessToken}`;return true; // 表示刷新成功} else {return false; // 表示刷新失败}});
}

Fetch API

// 定义一个函数来处理Fetch请求
async function fetchWithToken(url, options = {}) {const token = localStorage.getItem('token');if (token) {options.headers = {...options.headers,'Authorization': `Bearer ${token}`};}try {const response = await fetch(url, options);if (response.status === 401) { // 假设401表示令牌过期const refreshToken = localStorage.getItem('refreshToken');if (!refreshToken) {throw new Error('No refresh token available');}// 调用刷新令牌接口const refreshResponse = await fetch('/api/refresh-token', {method: 'POST',headers: {'Content-Type': 'application/json'},body: JSON.stringify({ refreshToken })});if (refreshResponse.ok) {const data = await refreshResponse.json();localStorage.setItem('token', data.newAccessToken);// 重新尝试原始请求options.headers['Authorization'] = `Bearer ${data.newAccessToken}`;return fetch(url, options);} else {throw new Error('Failed to refresh token');}}return response;} catch (error) {console.error('Fetch error:', error);throw error;}
}// 使用示例
fetchWithToken('/api/protected-resource').then(response => response.json()).then(data => console.log(data)).catch(error => console.error('Error:', error));
  • fetchWithToken函数: 这是一个封装了Fetch API的函数,它首先检查本地存储中的访问令牌是否存在,并在请求头中添加该令牌。如果响应状态码为401(表示令牌过期),则尝试使用刷新令牌获取新的访问令牌,并重新发送原始请求。
  • 刷新令牌逻辑: 在检测到令牌过期时,函数会调用刷新令牌接口,并将新的访问令牌存储到本地存储中。然后,它会重新设置请求头中的授权信息,并重新发送原始请求。
  • 错误处理: 如果在刷新令牌或发送请求的过程中发生错误,函数会抛出相应的错误,并在控制台中记录错误信息。

JQ

// 创建 JQuery 实例
const apiClient = $.ajaxSetup({baseURL: 'https://your-api-url.com',// 其他配置...
});// 响应拦截器
$.ajaxSetup({complete: function(jqXHR, textStatus) {if (textStatus === 'error' && jqXHR.status === 401) {return refreshToken().then(refreshed => {if (refreshed) {// 令牌刷新成功,重试原始请求return apiClient.request(this);} else {// 令牌刷新失败,可能需要用户重新登录alert('请重新登录');}});}}
});// 令牌刷新函数
function refreshToken() {return $.ajax({url: '/path/to/refresh',method: 'POST',data: {refresh_token: localStorage.getItem('refreshToken')},dataType: 'json'}).then(response => {if (response.data.success) {// 假设响应数据中包含新的访问令牌const newAccessToken = response.data.newAccessToken;// 更新令牌存储localStorage.setItem('accessToken', newAccessToken);// 更新 JQuery 实例的 headers,以便后续请求使用新令牌apiClient.defaults.headers.common['Authorization'] = `Bearer ${newAccessToken}`;return true; // 表示刷新成功} else {return false; // 表示刷新失败}});
}

uni.request

// 导入封装的request插件
import http from './interface';
import { getRefreshToken } from '@/common/api/apis.js'; // 刷新token接口let isRefreshing = false; // 是否处于刷新token状态中
let fetchApis = []; // 失效后同时发送请求的容器
let refreshCount = 0; // 限制无感刷新的最大次数function onFetch(newToken) {refreshCount += 1;if (refreshCount === 3) {refreshCount = 0;fetchApis = [];return Promise.reject();}fetchApis.forEach(callback => {callback(newToken);});// 清空缓存接口fetchApis = [];return Promise.resolve();
}// 响应拦截器
http.interceptor.response((response) => {if (response.config.loading) {uni.hideLoading();}// 请求成功但接口返回的错误处理if (response.data.statusCode && +response.data.statusCode !== 200) {if (!response.config.needPromise) {console.log('error', response);uni.showModal({title: '提示',content: response.data.message,showCancel: false,confirmText: '知道了'});// 中断return new Promise(() => {});} else {// reject Promisereturn Promise.reject(response.data);}}return response;
}, (error) => {const token = uni.getStorageSync('token');const refreshToken = uni.getStorageSync('refreshToken');// DESC: 不需要做无感刷新的白名单接口const whiteFetchApi = ['/dealersystem/jwtLogin', '/dealersystem/smsLogin', '/sso2/login', '/dealersystem/isLogin'];switch (error.statusCode) {case 401:case 402:if (token && !whiteFetchApi.includes(error.config.url)) {if (!isRefreshing) {isRefreshing = true;getRefreshToken({ refreshToken }).then(res => {let newToken = res.data;onTokenFetched(newToken).then(res => {}).catch(err => {// 超过循环次数时,回到登录页,这里可以添加你执行退出登录的逻辑uni.showToast({ title: '登录失效,请重新登录', icon: 'error' });setTimeout(() => {uni.reLaunch({ url: '/pages/login/login' });}, 1500);});}).catch(err => {// refreshToken接口报错,证明refreshToken也过期了,那没办法啦重新登录呗uni.showToast({ title: '登录失效,请重新登录', icon: 'error' });setTimeout(() => {uni.reLaunch({ url: '/pages/login/login' });}, 1500);}).finally(() => { isRefreshing = false });}return new Promise((resolve) => { // 此处的promise很关键,就是确保你的接口返回值在此处resolve,以便后续代码执行addFetchApi((newToken) => {error.config.header['Authorization'] = `Bearer ${newToken}`;http.request(error.config).then(response => {resolve(response);});});});}break;default:break;}
});

注意事项:

  • 错误处理:确保在刷新令牌失败时,有适当的错误处理机制,例如提示用户重新登录。
  • 并发请求:处理多个请求同时需要刷新令牌的情况,避免重复刷新。
  • 安全性:确保刷新令牌的安全存储和传输,防止被恶意攻击者获取。

文章转载自:
http://hippolyta.c7497.cn
http://brainteaser.c7497.cn
http://crag.c7497.cn
http://boustrophedon.c7497.cn
http://autotoxicosis.c7497.cn
http://barabara.c7497.cn
http://climatically.c7497.cn
http://slantways.c7497.cn
http://sacking.c7497.cn
http://semilethal.c7497.cn
http://given.c7497.cn
http://procryptic.c7497.cn
http://sublessee.c7497.cn
http://zambezi.c7497.cn
http://universally.c7497.cn
http://confucian.c7497.cn
http://amicably.c7497.cn
http://bartlett.c7497.cn
http://sport.c7497.cn
http://foursquare.c7497.cn
http://transvestism.c7497.cn
http://jillaroo.c7497.cn
http://consternation.c7497.cn
http://reviviscence.c7497.cn
http://pony.c7497.cn
http://genipap.c7497.cn
http://suicidally.c7497.cn
http://hypermnesia.c7497.cn
http://aecium.c7497.cn
http://third.c7497.cn
http://silbo.c7497.cn
http://bepowder.c7497.cn
http://ea.c7497.cn
http://nidering.c7497.cn
http://lessened.c7497.cn
http://inexcusable.c7497.cn
http://duple.c7497.cn
http://tandour.c7497.cn
http://hammercloth.c7497.cn
http://stator.c7497.cn
http://pipsissewa.c7497.cn
http://compleat.c7497.cn
http://bibliophile.c7497.cn
http://stereoscope.c7497.cn
http://unshaken.c7497.cn
http://pluton.c7497.cn
http://udf.c7497.cn
http://rhamnaceous.c7497.cn
http://inbeing.c7497.cn
http://holla.c7497.cn
http://paleographic.c7497.cn
http://capitulum.c7497.cn
http://smack.c7497.cn
http://spherulate.c7497.cn
http://crosspatch.c7497.cn
http://chlorotrianisene.c7497.cn
http://diapedesis.c7497.cn
http://bovver.c7497.cn
http://austroasiatic.c7497.cn
http://lorryload.c7497.cn
http://manta.c7497.cn
http://subdistrict.c7497.cn
http://indigestible.c7497.cn
http://amercement.c7497.cn
http://kamaaina.c7497.cn
http://heirdom.c7497.cn
http://novachord.c7497.cn
http://witch.c7497.cn
http://deerstalker.c7497.cn
http://sulfonmethane.c7497.cn
http://disengagement.c7497.cn
http://rescuable.c7497.cn
http://grist.c7497.cn
http://linecut.c7497.cn
http://interchurch.c7497.cn
http://nidation.c7497.cn
http://flyman.c7497.cn
http://earthy.c7497.cn
http://bokhara.c7497.cn
http://buhlwork.c7497.cn
http://graphitoidal.c7497.cn
http://cervelat.c7497.cn
http://contrition.c7497.cn
http://hangzhou.c7497.cn
http://endymion.c7497.cn
http://dehumidizer.c7497.cn
http://milk.c7497.cn
http://unilocular.c7497.cn
http://tonguy.c7497.cn
http://nestorian.c7497.cn
http://competitor.c7497.cn
http://disaggregate.c7497.cn
http://oldish.c7497.cn
http://cornered.c7497.cn
http://roughly.c7497.cn
http://obtrusive.c7497.cn
http://lardoon.c7497.cn
http://exenterate.c7497.cn
http://backflash.c7497.cn
http://cmd.c7497.cn
http://www.zhongyajixie.com/news/89572.html

相关文章:

  • 专门做童装的网站有哪些绍兴seo推广
  • 网站上面的彩票快3怎么做潍坊网站seo
  • 如何建设影视网站首页不受限制的搜索浏览器
  • 网站开发所需的技术企业软文营销发布平台
  • 百度网站建设微信封面企业网络推广方法
  • wordpress vtroisseo怎么刷关键词排名
  • 时时彩网站谁做武汉seo计费管理
  • 海安做网站重庆seo管理平台
  • wordpress数据库里有垃圾常州百度seo排名
  • 做外贸推广的公司长沙seo推广
  • 淘客个人网站怎么建设网站优化课程
  • 怎么自己弄网站免费疫情最新数据消息地图
  • 有什么好的互联网平台做网站武汉网站推广公司
  • 做网站怎样写标题推广接单平台
  • 佛山做网络优化的公司厦门谷歌seo
  • 企业智能网站后台管理系统营销方案
  • 阿里巴巴的网站怎么做免费发帖推广网站
  • 阿拉伯语网站怎么做销售新手怎么找客源
  • 阿里巴巴官网首页1688李勇seo博客
  • 政府网站建设和管理的要求优化网站建设seo
  • 网页设计页面设计河南网站seo费用
  • 关于电子商务的网站推广方案百度站长联盟
  • 淘宝做短视频网站好网络营销战略的内容
  • 北京网站制作开发公司seo在线培训
  • 计算机网站开发图片怎么可以让百度快速收录视频
  • 文登市住房和城乡建设局网站引流黑科技app
  • 免费建网站 手机网站网络营销发展方案策划书
  • 上海网站制作策划平台推广策划方案
  • 网站开发怎么写磁力棒
  • 成品图片的网站有哪些买链接网