我有拦截所有Http请求的服务,因此我可以检查用户的令牌是否有效。当Http响应为401时,我希望当前用户退出应用程序:
import { Http, ConnectionBackend, RequestOptions, RequestOptionsArgs, Request, Response } from '@angular/http'
import { Router } from '@angular/router'
import { Observable } from 'rxjs/Observable'
import { Injectable } from '@angular/core'
import { Config } from './shared/config'
import { RouterExtensions } from 'nativescript-angular/router'
import 'rxjs/add/observable/throw'
@Injectable()
export class RequestInterceptorService extends Http {
private config: Config = new Config()
constructor(
backend: ConnectionBackend,
defaultOptions: RequestOptions,
private router: Router,
private routerExtensions: RouterExtensions,
) {
super(backend, defaultOptions)
}
request(url: string | Request, options?: RequestOptionsArgs): Observable<Response> {
return this.intercept(super.request(url, options))
}
intercept(observable: Observable<Response>): Observable<Response> {
return observable.catch((err, source) => {
if (err.status === 401) {
this.logout()
return Observable.empty()
} else {
return Observable.throw(err)
}
})
}
logout() {
this.config.clear()
this.routerExtensions.navigate(["/signin"], {
clearHistory: true
})
}
}
我的问题是路由器或路由器扩展总是未定义的,因此我无法使用此服务将用户重定向到任何其他路径。
答案 0 :(得分:0)
所以,我找到了解决方案。这只是了解我正在做的事情的主要内容。
我创建了一个扩展RequestInterceptor
模块的Http
服务。它包括一个拦截器,用于检查状态代码是否等于401.为了使其与我的项目兼容,我决定将其作为Http
的自定义实现提供。 @NgModule上的以下代码就是这样:
providers: [
{
provide: Http,
useClass: RequestInterceptorService
}
]
但RequestInterceptorService
事件无法访问Http
个依赖关系:ConnectionBackend
和RequestOptions
,因此我必须使用deps
属性注入它们,这是一个数组,我可以在其中识别将被注入的依赖项数组。就我而言,我不仅需要注入Http
所需的依赖项(XHRBackend
,RequestOptions
),还要注入我的服务将使用的依赖项:RouterExtensions
。< / p>
我的providers
声明如下:
providers: [
{
provide: Http,
useClass: RequestInterceptorService,
deps: [XHRBackend, RequestOptions, RouterExtensions]
}
]
执行此操作后,当从任何请求返回401状态代码时,我能够成功将用户重定向到登录页面。