在Angular中使用JWT(JSON Web Token)时,我们通常需要在每个请求的header中包含访问令牌(token)。但令牌(token)可能会过期,因此需要定期刷新,避免因过期而造成的访问失败。
我们可以利用 Interceptor 拦截器,来检查令牌的过期时间,并在过期后使用 Refresh Token 刷新令牌,从而保持用户的身份认证。
我们首先创建一个名为 TokenInterceptor 的拦截器,它会从浏览器的本地存储中获取访问令牌,并将其添加到请求标头中。我们还可以在此拦截器中添加检查令牌过期的代码,并在必要时进行令牌刷新。
以下是一个示例:
import { Injectable } from '@angular/core'; import { HttpInterceptor, HttpRequest, HttpHandler, HttpEvent } from '@angular/common/http'; import { Observable } from 'rxjs/Observable';
@Injectable() export class TokenInterceptor implements HttpInterceptor {
constructor(private authService: AuthService) {}
intercept(request: HttpRequestBearer ${token}
}
});
// 检查令牌是否过期
if (this.authService.isTokenExpired()) {
// 如果过期,则使用 Refresh Token 进行刷新操作
this.authService.refreshToken().subscribe(response => {
// 刷新成功,将新访问令牌存储在浏览器本地存储中
localStorage.setItem('access_token', response.access_token);
// 用新访问令牌重新发送原有的请求
request = request.clone({
setHeaders: {
Authorization: Bearer ${response.access_token}
}
});
return next.handle(request);
}, error => {
// 刷新令牌失败,重定向至登录页
this.authService.logout();
});
} else {
// 令牌未过期,直接发送请求
return next.handle(request);
}
}
}
在上述代码中,我们通过检查 AuthService 中的 isTokenExpired() 方法来检查令牌是否过期。如果