我有一个Angular项目,我在其中建立了这样的解析路线:
{
path: 'participants/detailedView/:participantId',
component: ParticipantDetailedViewComponent,
resolve: {
participant: ParticipantResolve,
},
},
我的项目中也有一个HTTP拦截器,以拦截任何401错误并重定向到登录页面:
@Injectable()
export class JwtInterceptor implements HttpInterceptor {
constructor( public auth: AuthenticationService,
private router: Router ) {
}
public intercept( request: HttpRequest<any>, next: HttpHandler ): Observable<HttpEvent<any>> {
let url: string = request.url;
let method: string = request.method;
console.log(`JwtInterceptor url=${url}, method=${method}`);
return next.handle( request ).do( ( event: HttpEvent<any> ) => {
console.log(`successful reply from the server for request=${request.urlWithParams}`);
})
.catch((responseError: any) => {
// ResponseError Interceptor
if (responseError instanceof HttpErrorResponse) {
console.error('response in the catch: ', responseError);
if ( responseError.status === 401 ) {
let errorMsg: string = '';
if ( responseError.statusText === 'Invalid credentials' ) {
errorMsg = 'Username or password is incorrect';
}
// redirect to the login route
this.router.navigate(['/login'], {queryParams: {msg: errorMsg}});
return Observable.empty();
}
return throwError(responseError);
}
let error = new HttpErrorResponse({
status: 500,
statusText: 'Unknown Error',
error: {
message: 'Unknown Error'
}
});
return throwError( error );
}) as any;
}
}
如果在解析过程中的HTTP调用期间抛出401错误,我的拦截器会将用户重定向到登录页面。
这时,我想知道目标URL是什么,以便能够将用户重定向到他成功登录后想要查看的页面。
所以我的问题是:如何通过HTTP拦截器知道目标URL?
到目前为止,我找到的唯一解决方案是在服务中监听NavigationStart
事件,将值存储并在我的HTTP Interceptor中使用它。
我不太喜欢这种解决方案,我认为应该有更好的方法,但是找不到。
有什么想法吗?