我正在尝试为失败的请求实现拦截器,以防令牌过期。我尝试了多种方法,但仍然没有成功。
我在下面提到了网址
我已经尝试将所有请求收集到cachedRequests: Array中
this.next.handle(request) 在成功刷新令牌后未召回。不过,我可以看到更新的请求对象。
有人可以指出在 Angular 7 中用“rxjs”引用的位置:“
~6.3.3”、“rxjs-compat”:“^6.5.2”,以实现拦截器。
下面是对我有用的代码,但只得到令牌的响应
``````````
handleError(request: HttpRequest<any>, next: HttpHandler, err) {
if (err instanceof HttpErrorResponse) {
if (err.status === 401) {
this.service.getNewToken().pipe(filter(token => token != null),
take(1),
switchMap((token: any) => {
console.log('token', token);
if (token && token.access_token && token.refresh_token) {
sessionStorage.setItem('accessToken', token.access_token);
sessionStorage.setItem('refreshToken', token.refresh_token);
}
request = this.addHeader(request);
request.headers.getAll('Authorization');
return next.handle(request);
})).subscribe(results => this.subject.next(results));
}
}
}
`````````
更新2:在尝试了多种方法后,我发现
感谢指点
在 api 失败并出现 HTTP 错误 401 后,令牌刷新 api 被调用,所有失败和缓存的请求都可以使用 http 拦截器重试。
if (this.isRefreshingToken && !req.url.endsWith(tokenURL)) {
// check if unique url to be added in cachedRequest
if (urlPresentIndex == -1) {
this.cachedRequests.push(req);
return this.tokenSubject.pipe(
switchMap(() => next.handle(req)),
tap((v) => {
// delete request from catchedRequest if api gets called
this.cachedRequests.splice(
this.cachedRequests.findIndex(
(httpRequest) => httpRequest.url == req.url
),
1
);
return EMPTY;
})
);
} else {
//already in cached request array
return EMPTY;
}
}
有关更多详细信息,您可以阅读我的中型文章令牌刷新侦听器重试失败的请求
看看它的工作原理
回复晚了。我是这样做的。
也适用于并行请求。
import { HttpInterceptor, HttpRequest, HttpHandler, HttpErrorResponse, HttpEvent, HttpResponse } from '@angular/common/http';
import { Injectable } from '@angular/core';
import { environment } from 'src/environments/environment';
import { GlobalService } from './global.service';
import { tap, mergeMap, switchMap, filter, take, flatMap, catchError } from 'rxjs/operators';
import { Observable, Subject, throwError, of, BehaviorSubject } from 'rxjs';
@Injectable()
export class InterceptorService implements HttpInterceptor {
private isRefreshing = false;
private refreshTokenSubject: BehaviorSubject<any> = new BehaviorSubject<any>(null);
constructor(public globalService: GlobalService) {
}
intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
request = this.addHeader(request);
// console.log('request ', request);
return next.handle(request).pipe(catchError((error: any) => {
if (error instanceof HttpErrorResponse) {
if (error.status === 401) {
if (!this.isRefreshing) {
this.isRefreshing = true;
this.refreshTokenSubject.next(null);
request = this.addHeader(request);
console.log('Token request');
return this.globalService.getRefershToken().pipe(
switchMap((token: any) => {
console.log('inside token');
this.isRefreshing = false;
if (token && token.access_token && token.refresh_token) {
sessionStorage.setItem('accessToken', token.access_token);
sessionStorage.setItem('refreshToken', token.refresh_token);
}
// request = this.addHeader(request);
// console.log('request: ', request);
this.refreshTokenSubject.next(token);
return next.handle(this.addHeader(request));
}));
} else {
console.log('inside else call');
console.log('token : ', this.refreshTokenSubject.getValue());
return this.refreshTokenSubject.pipe(
filter(token => (token != null && token != undefined)),
take(1),
switchMap(() => {
console.log('adding header in else');
return next.handle(this.addHeader(request))
}));
}
}
}
}));
}
private addHeader(request: HttpRequest<any>) {
let getEndPoint = request.url.split('/')[request.url.split('/').length - 1];
if (getEndPoint !== 'refreshToken') {
const accessToken = sessionStorage.getItem('accessToken');
request = request.clone({
setHeaders: {
Authorization: `Bearer ${accessToken}`
}
});
} else if (getEndPoint === 'refreshToken') {
const refreshToken = sessionStorage.getItem('refreshToken');
request = request.clone({
setHeaders: {
applicationCode: environment.applicationCode,
'refresh-token': `${refreshToken}`,
}
});
}
return request;
}
}
问题内容: 好的,我有一个仅包含的简单表格。当我们点击submit(通过ajax存储)时,在文本字段中写入的数据将存储在DB中。Ajax可以正常工作并提交数据,但是,页面会自动刷新,并且URL包含输入字段的内容。 我的表格: 阿贾克斯:- PHP的:- 结果显示在后,页面将刷新,URL变为: -chat.php?message = 454545&submit_message = 为什么要刷新页面?
问题内容: 我试图找出一种方法来保持我的变量与页面刷新/跨控制器。我的工作流程是 用户通过Facebook登录并获得访问令牌 用户访问令牌将与每个请求一起使用 我尝试了两种方法, 1-将令牌分配给 不工作 2-使用 但是问题是,如果刷新页面,该页面将变为空白。我是新手,无法找到刷新页面后保留数据的方法 任何帮助将非常感激 问题答案: 您可以使用。真的很容易使用。
您好,我正试图通过刷新令牌并重试请求,找出如何实现新的角度拦截器和处理错误。这是我一直遵循的指南:https://ryanchenkie.com/angular-authentication-using-the-http-client-and-http-interceptors 我成功缓存失败的请求,并可以刷新令牌,但我不知道如何重新发送以前失败的请求。我还想让它与我目前使用的解析器一起工作。 t
我正在开发angular 7应用程序,但在get请求中遇到了问题。 以下是错误: 这是我的角色服务。ts: 这是组件。输电系统 当服务器向我发送请求的数据时,我不明白这个错误来自哪里。 提前谢谢你!!!
我想创建一个FastAPIendpoint,它只接受任意发布请求正文并返回它。 如果我发送,我想得到。但我也希望能够发送并取回它。 我试过了: 但是无论我发送什么,这都会返回一个空字典。 有什么想法吗?
我试图在flask应用程序上记录post请求,如下所示: 我这样做是因为我怀疑有时我会在POST上得到一个格式错误的JSON对象。我看到的问题是日志包含一个截断的请求体——它似乎被夹在中间... 我不能放日志摘要,因为它是敏感数据。。为什么请求被截断?我做错了吗? 谢谢