- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我使用 token 作为授权,当 token 过期时,我想使用刷新 token 创建一个新 token 。我可以用 axios 库做到这一点,但我找不到如何用 umi 请求做到这一点。有人将下面给出的代码示例翻译成一个 umi 请求拦截器示例吗?
这个 axios 拦截器响应我的刷新 token 操作。
let isRefreshing: boolean = false;
let failedQueue: any = [];
const processQueue = (error: any, token: any = null) => {
failedQueue.forEach((prom: any) => {
if (error) {
prom.reject(error);
} else {
prom.resolve(token);
}
});
failedQueue = [];
};
axios.interceptors.response.use(
async response => {
return response;
},
async error => {
debugger;
const originalRequest = error.config;
if (error.response) {
const status = error.response.status;
const refreshToken = getStoredUserAuth().refreshToken;
if (status === 401 && !originalRequest._retry) {
if (isRefreshing) {
return new Promise(function(resolve, reject) {
failedQueue.push({ resolve, reject });
})
.then(token => {
originalRequest.headers["Authorization"] = "Bearer " + token;
return axios(originalRequest);
})
.catch(err => {
return Promise.reject(err);
});
}
originalRequest._retry = true;
isRefreshing = true;
return new Promise(function(resolve, reject) {
refreshAccessToken(refreshToken)
.then(response => {
if (response.status === 200) {
if (response.data.token) {
setAuthStatus(response.data);
axios.defaults.headers.common["Authorization"] =
"Bearer " + response.data.token;
originalRequest.headers["Authorization"] =
"Bearer " + response.data.token;
}
processQueue(null, response.data.token);
resolve(axios(originalRequest));
} else {
throw new Error();
}
})
.catch(err => {
//console.log(err);
failedQueue = [];
setUnauthStatus();
source.cancel("Session time out");
processQueue(err, null);
reject(err);
})
.then(() => {
isRefreshing = false;
});
});
}
} else {
debugger;
errorHandler(error);
}
return Promise.reject(error);
}
);
我用的是ant design pro V5版本,所以尝试用umi request来刷新token,但是不行,在axios库中,不能写umi request,也不能建立它的逻辑。那么任何人都可以为 umi 请求编写上面相同的示例(axios.interceptors.response)吗?
const requestInterceptors = (url: string, options: RequestOptionsInit) => {
if (tokenService.check()) {
const headers = {
'Content-Type': 'application/x-www-form-urlencoded',
'Accept': 'application/x-www-form-urlencoded',
'Authorization': `Bearer ${tokenService.parse()?.token}`,
};
return {
url,
options: { ...options, headers },
};
}
return {
url,
options: { ...options },
};
};
const responseInterceptors = (response: Response, options: RequestOptionsInit) => {
// I could'nt this part for refresh token like axios interceptors. I need help for that
return response;
}
export const request: RequestConfig = {
errorHandler,
requestInterceptors: [requestInterceptors],
responseInterceptors: [responseInterceptors]
};
umi request github link for documentation
最佳答案
这是我在 umi-request/ant-design-pro 中处理刷新 token 的解决方案,不需要 queue
s,就像一个魅力
// Neccesary imports
import type { RequestConfig } from 'umi';
import { request as requestUmi } from 'umi';
import type {
RequestInterceptor,
RequestOptionsInit,
ResponseError,
} from 'umi-request';
import Reqs from 'umi-request';
import merge from 'lodash/merge';
import cloneDeep from 'lodash/cloneDeep';
// My personal type definitions
namespace API {
export interface LoginResult {
access: string;
refresh: string;
}
}
// Part 1: "Simple" Error Handler =))
const errorHandler = (error: ResponseError) => {
console.log('HTTP ERROR', error);
throw error;
};
// Part 2: Request Interceptors, (use this instead of "headers" directly in request config)
const requestInterceptor: RequestInterceptor = (url, options) => {
return {
url,
options: merge(cloneDeep(options), {
headers: { Authorization: `Bearer ${jwt.getAccess()}` },
}),
};
};
// Part 3: Response Interceptos
const { cancel } = Reqs.CancelToken.source();
let refreshTokenRequest: Promise<API.LoginResult> | null = null;
const responseInterceptor = async (
response: Response,
options: RequestOptionsInit
) => {
const accessTokenExpired = response.status === 401;
if (accessTokenExpired) {
try {
if (!refreshTokenRequest) {
refreshTokenRequest = refreshAccessToken(jwt.getRefresh());
}
// multiple requests but "await"ing for only 1 refreshTokenRequest, because of closure
const res = await refreshTokenRequest;
if (!res) throw new Error();
if (res.access) jwt.saveAccess(res.access);
if (res.refresh) jwt.saveRefresh(res.refresh); // for ROTATE REFRESH TOKENS
return requestUmi(
response.url,
merge(cloneDeep(options), {
headers: { Authorization: `Bearer ${res.access}` },
})
);
} catch (err) {
jwt.removeAccess();
jwt.removeRefresh();
cancel('Session time out.');
throw err;
} finally {
refreshTokenRequest = null;
}
}
return response;
};
export const request: RequestConfig = {
errorHandler,
// This would fuck the refresh token logic, use requestInterceptors instead,
// because jwt.getAccess() will not being called everytime, but only the first time => lead to stale access token
// headers: { Authorization: `Bearer ${jwt.getAccess()}` },
// Handle refresh token (old): https://github.com/ant-design/ant-design-pro/issues/7159#issuecomment-680789397
// Handle refresh token (new): https://gist.github.com/paulnguyen-mn/8a5996df9b082c69f41bc9c5a8653533
requestInterceptors: [requestInterceptor],
responseInterceptors: [responseInterceptor],
};
还贴了
here
关于javascript - umi 请求拦截器响应的 Refresh Token,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63340790/
我正在尝试从该网站抓取历史天气数据: http://www.hko.gov.hk/cis/dailyExtract_uc.htm?y=2016&m=1 在阅读了 AJAX 调用后,我发现请求数据的正确
我有两个 postman 请求 x,y,它们命中了两个不同的休息 api X,Y 中的端点。 x 会给我一个身份验证 token ,这是发出 y 请求所必需的。如何在请求 y 中发出请求 x ?也就是
我使用请求库通过 API 与其他服务器进行通信。但现在我需要同时发送多个(10 个或更多)POST 请求,并且只有在所有响应都正确的情况下才能进一步前进。通常语法看起来有点像这样: var optio
背景:当用户单击按钮时,其类会在class1和class2之间切换,并且此数据是通过 AJAX 提交。为了确认此数据已保存,服务器使用 js 进行响应(更新按钮 HTML)。 问题:如果用户点击按钮的
我正在将 Node.js 中的请求库用于 Google 的文本转语音 API。我想打印出正在发送的请求,如 python example . 这是我的代码: const request = requi
我经常使用requests。最近我发现还有一个 requests2 和即将到来的 requests3 虽然有一个 page其中简要提到了 requests3 中的内容,我一直无法确定 requests
我正在尝试将图像发送到我的 API,然后从中获取结果。例如,我使用发送一个 bmp 图像文件 file = {"img": open("img.bmp)} r = requests.post(url,
我发现 Google Cloud 确保移出其物理环境的任何请求都经过强制加密,请参阅(虚拟机到虚拟机标题下的第 6 页)this link Azure(和 AWS)是否遵循类似的程序?如果有人能给我指
我有一个 ASP.NET MVC 应用程序,我正在尝试在 javascript 函数中使用 jQuery 来创建一系列操作。该函数由三部分组成。 我想做的是:如果满足某些条件,那么我想执行同步 jQu
我找不到如何执行 get http 请求,所以我希望你们能帮助我。 这个想法是从外部url(例如 https://api.twitter.com/1.1/search/tweets.json?q=tw
我的应用只需要使用“READ_SMS”权限。我的问题是,在 Android 6.0 上,当我需要使用新的权限系统时,它会要求用户“发送和查看短信”。 这是我的代码: ActivityCompat.re
我的前端代码: { this.searchInput = input; }}/> 搜索 // search method: const baseUrl = 'http://localho
我有一个由 AJAX 和 C# 应用程序使用的 WCF 服务, 我需要通过 HTTP 请求 header 发送一个参数。 在我的 AJAX 上,我添加了以下内容并且它有效: $.ajax({
我正在尝试了解如何使用 promises 编写代码。请检查我的代码。这样对吗? Node.js + 请求: request(url, function (error, response, body)
如果失败(除 HTTP 200 之外的任何响应代码),我需要重试发送 GWT RPC 请求。原因很复杂,所以我不会详细说明。到目前为止,我在同一个地方处理所有请求响应,如下所示: // We
当用户单击提交按钮时,我希望提交表单。然而,就在这种情况发生之前,我希望弹出一个窗口并让他们填写一些数据。一旦他们执行此操作并关闭该子窗口,我希望发出 POST 请求。 这可能吗?如果可能的话如何?我
像 Facebook 这样的网站使用“延迟”加载 js。当你必须考虑到我有一台服务器,流量很大时。 我很感兴趣 - 哪一个更好? 当我一次执行更多 HTTP 请求时 - 页面加载速度较慢(由于限制(一
Servlet 容器是否创建 ServletRequest 和 Response 对象或 Http 对象?如果是ServletRequest,谁在调用服务方法之前将其转换为HttpServletReq
这是维基百科文章的摘录: In contrast to the GET request method where only a URL and headers are sent to the serv
我有一个循环,每次循环时都会发出 HTTP post 请求。 for(let i = 1; i console.log("succes at " + i), error => con
我是一名优秀的程序员,十分优秀!