【发布时间】:2019-06-06 10:53:17
【问题描述】:
在每次请求之前,HTTP 拦截器会检查访问令牌是否已过期,如果已过期,它会首先更新令牌,然后继续请求。
问题出在有多个请求的页面上。在这些页面上,拦截器会尝试为每个请求更新令牌。
在这种情况下如何共享令牌更新请求?
负责令牌更新的方法是这样的:
renewToken() {
let refreshToken = // get refresh token
let accessToken = // get access token
if (!refreshToken || !accessToken)
return;
let requestData = {
accessToken: accessToken,
refreshToken: refreshToken
}
return this.http.post<ApplicationToken>(`${this.baseUrl}/renewToken`, requestData)
.pipe(
// I tried share() shareReplay(1) and publishReplay(1) here but no luck
);
}
这就是拦截器使用该方法的方式:
...
// in case we need to renew the token
return this.accountService.renewToken()
.pipe(
switchMap(t => {
this.accountService.saveToken(t);
token = this.accountService.getAccessToken();
var newReq = this.setToken(req, token);
return next.handle(newReq);
})
);
...
【问题讨论】:
-
如果你将 observable 设为服务的公共属性会怎样? (不确定这是一个好的模式,但是......)
标签: angular rxjs observable angular7