保持用户会话流畅的关键在于无需持续登录。本文将演示如何在 angular 中实现令牌刷新流程,处理 401 错误并高效管理并发请求。
为了最大限度地降低安全风险,身份验证系统中的访问令牌通常具有较短的生命周期。当访问令牌过期时,刷新令牌允许应用程序在无需用户重新登录的情况下向服务器请求新的访问令牌。
我们将使用 Angular 的 HTTP 拦截器实现令牌刷新机制。其目标是在重试原始请求之前拦截未授权的请求(401 错误)并刷新令牌。

代码概述
handleUnauthorized 方法负责在请求因令牌过期而失败时刷新令牌。<code class="typescript">handleUnauthorized(req: HttpRequest<any>, next: HttpHandler): Observable<any> {
if (!this.isRefreshingToken) {
this.isRefreshingToken = true;
this.tokenSubject.next(null); // 通知所有等待请求令牌正在刷新
return this.refreshToken().pipe(
switchMap((newToken: string) => {
if (newToken) {
this.tokenSubject.next(newToken);
return next.handle(this.addToken(req, newToken)); // 使用新令牌重试原始请求
}
this.logout();
return throwError(() => '令牌过期');
}),
catchError((error) => {
this.logout();
return throwError(() => error);
}),
finalize(() => {
this.isRefreshingToken = false;
}),
);
} else {
// 令牌正在刷新时,将请求排队
return this.tokenSubject.pipe(
filter((token) => token !== null),
take(1),
switchMap((token) => next.handle(this.addToken(req, token))),
);
}
}</code>handleUnauthorized 函数处理 HTTP 请求收到 401 未授权状态码的情况(指示访问令牌过期或无效),确保应用程序可以刷新令牌并无缝重试失败的请求。
ShopNum1是武汉群翔软件有限公司自主研发的基于 WEB 应用的 B/S 架构的B2C网上商店系统,主要面向中高端客户,为企业和大中型网商打造优秀的电子商务平台, ShopNum1运行于微软公司的 .NET 平台,采用最新的 ASP.NET 3.5技术进行分层开发。 拥有更强的安全性、稳定性、易用性 。ShopNum1分销系统是实现您货源网络分销,代理渠道网络拓展、品牌直销店连锁加盟的一套B2
0
isRefreshingToken 标志确保一次只发出一个令牌刷新请求。如果令牌正在刷新,则后续请求将排队,直到新令牌可用。<code class="typescript">if (!this.isRefreshingToken) {
this.isRefreshingToken = true;
this.tokenSubject.next(null);
}</code>refreshToken 方法来启动令牌刷新。收到新令牌后:tokenSubject 中。<code class="typescript">return this.refreshToken().pipe(
switchMap((newToken: string) => {
// ...
})
);</code>tokenSubject 发出新令牌,然后继续。<code class="typescript">return this.tokenSubject.pipe( filter((token) => token !== null), take(1), switchMap((token) => next.handle(this.addToken(req, token))), );</code>
<code class="typescript">catchError((error) => {
this.logout();
return throwError(() => error);
}),</code>finalize 运算符确保重置 isRefreshingToken 标志,以便允许后续刷新请求。<code class="typescript">finalize(() => {
this.isRefreshingToken = false;
}),</code>将令牌添加到请求:addToken 方法将新令牌附加到传出请求的标头中。
<code class="typescript">addToken(request: HttpRequest<any>, token: string): HttpRequest<any> {
return request.clone({
setHeaders: {
'x-token': token,
},
});
}</code>在 Angular HTTP 拦截器中使用:HTTP 拦截器是实现此流程的理想位置。它允许您拦截所有 HTTP 请求并全局处理令牌管理,而无需修改单个服务调用。
<code class="typescript">return next.handle(request).pipe(
catchError((error) => {
if (error.status === 401) {
return this.authService.handleUnauthorized(req, next);
}
return throwError(() => error);
}),
);</code>总之,一个健壮的令牌刷新流程确保 Angular 应用程序拥有流畅的用户体验和安全的会话管理。通过有效处理 401 错误并管理并发请求,您可以提高应用程序的可靠性和用户满意度。
以上就是Angular 中的刷新令牌的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号