我想從一個地方檢查我所有的http響應。例如身份驗證狀態。如果回覆表示用戶沒有進行身份驗證,我想重定向或其他東西。有沒有辦法做到這一點。如何編寫AngularJS 2的http攔截器?
7
A
回答
5
在這裏,我們去
創建這樣
export const JWT_RESPONSE_HEADER = 'X-Auth-Token';
@Injectable()
export class AuthHttp extends Http {
constructor(backend: ConnectionBackend, defaultOptions: RequestOptions) {
super(backend, defaultOptions);
}
request(url: string | Request, options?: RequestOptionsArgs): Observable<Response> {
const request = super.request(url, this.appendAuthHeader(options));
request.map(this.saveToken);
return request;
}
get(url: string, options?: RequestOptionsArgs): Observable<Response> {
const request = super.get(url, this.appendAuthHeader(options));
request.map(this.saveToken);
return request;
}
post(url: string, body: any, options?: RequestOptionsArgs): Observable<Response> {
const request = super.post(url, body, this.appendAuthHeader(options));
request.map(this.saveToken);
return request;
}
put(url: string, body: any, options?: RequestOptionsArgs): Observable<Response> {
const request = super.put(url, body, this.appendAuthHeader(options));
request.subscribe(this.saveToken);
return request;
}
delete(url: string, options?: RequestOptionsArgs): Observable<Response> {
const request = super.delete(url, this.appendAuthHeader(options));
request.map(this.saveToken);
return request;
}
private appendAuthHeader(options?: RequestOptionsArgs): RequestOptionsArgs {
let mergedOptions: RequestOptionsArgs;
if (!options) {
mergedOptions = { headers: new Headers() };
} else {
mergedOptions = options;
}
const token = localStorage.getItem(JWT_RESPONSE_HEADER);
const isTokenSet = mergedOptions.headers.has('Authorization');
if (token && !isTokenSet) mergedOptions.headers.append('Authorization', `Bearer ${token}`);
return mergedOptions;
}
private saveToken(res: Response): void {
const token = res.headers.get(JWT_RESPONSE_HEADER);
if (token) localStorage.setItem(JWT_RESPONSE_HEADER, token);
}
}
服務,並將其納入你app.module.ts這樣
@NgModule({
imports: [
BrowserModule,
ContentModule,
routing,
HttpModule
],
declarations: [
AppComponent,
LoginComponent
],
providers: [
appRoutingProviders,
LoginService,
{
provide: Http,
useFactory: (backend: XHRBackend, defaultOptions: RequestOptions) => new AuthHttp(backend, defaultOptions),
deps: [XHRBackend, RequestOptions]
}
],
bootstrap: [AppComponent]
})
export class AppModule {
}
你沒有做出任何更改
你的其他服務女巫使用http
+0
它適合你嗎?我有4.2.4版本的Angular和相同的解決方案,但不添加頭文件。 http.es5.js中的錯誤(Http.prototype.get函數)。看起來它與https://github.com/angular/angular/issues/19260有關 –
1
從角的4.3版本,你可以使用
HttpInterceptor
也。來自官方文檔的更多信息在這裏HttpInterceptor。
@Injectable()
export class AuthInterceptor implements HttpInterceptor {
constructor(public auth: AuthService) {}
intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
request = request.clone({
setHeaders: {Authorization: `Bearer ${this.auth.getToken()}`}
});
return next.handle(request);
}
}
相關問題
- 1. AngularJS $ HTTP攔截
- 2. 如何在骨幹中編寫http攔截器
- 3. AngularJS:錯誤注入http攔截器
- 4. Angularjs覆蓋http全局攔截器
- 5. 角2 HTTP響應攔截
- 6. 如何通過angularjs中的攔截器發送http請求?
- 7. AngularJS中的攔截器
- 8. Angular 4 - HTTP攔截器
- 9. 向$ http攔截器注入$ http服務?
- 10. 測試Angular http攔截器
- 11. angularjs $ httpProvider攔截器文檔
- 12. 如何在Angular2中將Http_Provider重寫爲AngularJS攔截器
- 13. Angularjs - 在攔截
- 14. 攔截angularJS
- 15. angularjs $ http攔截器將覆蓋其他http標頭
- 16. AngularJS攔截所有$ http JSON響應
- 17. Angular http攔截器配置
- 18. 如何爲ILogger攔截攔截器
- 19. 用於HTTP例外的Cxf攔截器
- 20. 在ASP.Net中攔截HTTP MVC 2
- 21. struts 2令牌攔截器
- 22. 如何爲返回IEnumerable的方法編寫攔截器
- 23. 如何編寫一個簡單的錯誤攔截器?
- 24. AngularJS攔截器何時被調用?
- 25. PHP - Smarty - Http請求攔截器
- 26. 攔截Jetty中的HTTP Connect
- 27. 如何攔截編譯器通過
- 28. 攔截angulargs http調用
- 29. http攔截器上的Angularjs + strictdi錯誤(打字稿)
- 30. AngularJS中執行$ http攔截器的順序是什麼?
你應該看看這個文檔https://github.com/angular/http/issues/80。 Angular2 Http攔截器和變壓器現在正在進行深入討論。如果你需要重定向一個未經身份驗證的用戶,我會建議你做那個服務器端(除了SPA) – Antoine