以下是一个示例代码,展示如何使用Angular拦截器来添加令牌并自动刷新:
auth.interceptor.ts
文件,用于定义拦截器逻辑:import { Injectable } from '@angular/core';
import {
HttpRequest,
HttpHandler,
HttpEvent,
HttpInterceptor
} from '@angular/common/http';
import { Observable, EMPTY, throwError } from 'rxjs';
import { catchError, switchMap } from 'rxjs/operators';
import { AuthService } from './auth.service';
@Injectable()
export class AuthInterceptor implements HttpInterceptor {
constructor(private authService: AuthService) {}
intercept(request: HttpRequest, next: HttpHandler): Observable> {
if (!this.authService.isAuthenticated()) {
return next.handle(request); // 如果用户未登录,则直接发送请求
}
return this.authService.refreshToken().pipe(
switchMap((token: string) => {
// 刷新成功后,将新的令牌添加到请求头中
request = request.clone({
setHeaders: {
Authorization: `Bearer ${token}`
}
});
return next.handle(request);
}),
catchError((error) => {
// 处理刷新令牌失败的情况,例如跳转到登录页
this.authService.logout();
return EMPTY;
})
);
}
}
auth.service.ts
文件,用于处理认证逻辑和刷新令牌的逻辑:import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { Observable, of } from 'rxjs';
@Injectable({
providedIn: 'root'
})
export class AuthService {
private refreshTokenUrl = 'http://example.com/refresh-token'; // 刷新令牌的接口地址
private isAuthenticated = false;
constructor(private http: HttpClient) {}
refreshToken(): Observable {
// 发送请求刷新令牌
return this.http.post(this.refreshTokenUrl, {}).pipe(
// 假设服务器返回新的令牌
(response) => response.token,
(error) => {
// 处理刷新令牌失败的情况
console.error('Failed to refresh token');
return of(null);
})
);
}
isAuthenticated(): boolean {
return this.isAuthenticated;
}
logout(): void {
// 清除令牌和其他认证信息
this.isAuthenticated = false;
// 其他清除操作
}
}
app.module.ts
文件中,注册拦截器:import { HTTP_INTERCEPTORS } from '@angular/common/http';
import { AuthInterceptor } from './auth.interceptor';
@NgModule({
declarations: [...],
imports: [...],
providers: [
{
provide: HTTP_INTERCEPTORS,
useClass: AuthInterceptor, // 注册拦截器
multi: true
}
],
bootstrap: [...]
})
export class AppModule { }
通过以上代码,你可以实现在每次发送请求时,拦截器会检查用户是否已经登录。如果用户已经登录,则会尝试刷新令牌并将新的令牌添加到请求头中。如果刷新令牌失败,则会进行相应的错误处理,例如强制用户重新登录。