作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
所以我正在使用 adal.js 和 angular 2 对 Microsoft AD 进行身份验证。我掌握了 adal.js 的窍门,可以登录、刷新 token 、注销、获取用户等。
我现在的问题是处理扩展 Http 和创建自定义类,在 401 上将重试刚刚失败的请求。
这基本上是我现在所拥有的:
export class HttpInterceptor extends Http {
constructor(backend: ConnectionBackend, defaultOptions: RequestOptions, private _router: Router, private adal: IgAdal) {
super(backend, defaultOptions);
}
request(url: string | Request, options?: RequestOptionsArgs): Observable<Response> {
return this.intercept(super.request(url, this.getRequestOptionArgs(options)));
}
get(url: string, options?: RequestOptionsArgs): Observable<Response> {
return this.intercept(super.get(url, this.getRequestOptionArgs(options)));
}
intercept(observable: Observable<Response>): Observable<Response> {
return observable.catch((err, source) => {
if (err.status == 401) {
this.adal.acquireTokenObservable().flatMap(data=>{
// NOT SURE WHAT TO DO HERE...
return Observable.throw(err);
})
} else {
return Observable.throw(err);
}
});
}
}
这在它不是 401 时效果很好,它应该抛出错误。现在,当我尝试在 401 之后调用 super.get() 并获取了一个新 token 时......它不会再次尝试请求,而是出现这样的错误......
Cannot read property 'subscribe' of undefined
^^^ 我觉得这和request all 返回后的订阅有关系。
我认为还值得指出的是,我的 main.ts 设置很好,因为拦截器至少可以正常工作。
intercept(observable: Observable<Response>): Observable<Response> {
return observable.catch((err, source) => {
if (err.status == 401) {
return this.adal.acquireTokenObservable().flatMap(data=>{
return observable.retry(3);
})
} else {
return Observable.throw(err);
}
});
}
刚刚尝试了“重试”rxjs 运算符.. 似乎正在做我想做的事情。现在我的问题是...重试失败后如何将某人发送到登录页面?
这是我的第一个 stackoverflow 问题,如果布局不是最好的,我深表歉意
谢谢!!
最佳答案
对于任何调查此问题的人...我最终会这样做。
intercept(observable: Observable<Response>): any {
return observable.catch((err, source) => {
if (err.status == 401) {
return this.adal.acquireTokenObservable().flatMap(data=>{
if (data === 'User login is required') {
this.adal.login();
}
return observable;
})
} else {
return Observable.throw(err);
}
});
}
返回可观察流本身而不是 .retry() 似乎做完全相同的事情并且也只是重试 1 次。否则 .retry(1) 实际上会出于某种原因抛出 3 个单独的错误。
this.adal.acquireTokenObservable()
是我使用 adal.js 库返回带有新 token 的流的可观察对象。仍在处理有关重试某些请求的其他几个问题,但这是一个好的开始。
关于angular - 401 的拦截器,更新并重试 Angular 2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39649914/
我是一名优秀的程序员,十分优秀!