我正在尝试使用拦截器在我的 Angular 应用程序中实现访问令牌处理。
在 Spring 后端中,我将一些路由设置为公开的(例如localhost:8080/api/public/hello
),而一些路由只能使用访问令牌(例如localhost:8080/api/hello
)进行访问。我还通过覆盖 WebMvcConfigurer禁用了 CORS 支持。
如果组件正在调用公共API,则拦截器工作正常,添加了 Authorization 标头,但显然它不需要加载页面,但它设置正确并且似乎工作正常。
但是,如果我要调用非公共API,拦截器将无法工作:将调用两个请求,第一个包含 Authorization 标头但它不工作,另一个没有标头,并且没有达到。详细信息如下图所示。
我的拦截器代码只是简单地克隆请求参数并设置标头,API 调用是组件中非常简单的一行。添加了相关的导入,并且模块、提供程序应该是正确的(公共 API 工作,所以拦截器本身应该没问题)。
拦截器(token-interceptor.service.ts):
intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<unknown>> {
const authReq = req.clone({
setHeaders: {
Authorization: this.getAccessToken()
}
});
return next.handle(authReq);
}
组件(home.component.ts):(. helloPublic 和 .hello 是方法名)
ngOnInit(): void {
this.helloApi.helloPublic().subscribe((response: HelloDto) => {
this.hello = response;
});
}