Chcę sprawdzić wszystkie moje odpowiedzi http z jednego miejsca. Na przykład stan uwierzytelnienia. Jeśli odpowiedź mówi, że użytkownik nie jest już uwierzytelniony, chcę przekierować lub coś innego. Czy istnieje jakiś sposób, aby to zrobić.Jak napisać przechwytywacz http dla AngularJS 2?
7
A
Odpowiedz
5
Zaczynamy
Tworzenie obsługa jak tego
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);
}
}
I umieścić go w ty app.module.ts jak ten
@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 {
}
nie trzeba wprowadzać żadnych zmian w Twoja inna usługa korzysta z http
+0
Czy to działa? Mam wersję 4.2.4 Angulara i tego samego rozwiązania, ale nagłówek nie został dodany. Błąd w http.es5.js (funkcja Http.prototype.get). Wygląda na to, że jest to powiązane z https://github.com/angular/angular/issues/19260 –
1
Również od wersji 4.3 kątowych można wykorzystać HttpInterceptor
. Więcej informacji z oficjalnej dokumentacji znajduje się tutaj 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);
}
}
Powiązane problemy
- 1. Angular 4 - Przechwytywacz HTTP
- 2. Jak napisać moduł niestandardowy dla AngularJS?
- 3. AngularJS przechwytuje wszystkie żądania HTTP http:
- 4. Jak napisać żądanie HTTP
- 5. napisać lepszy kod zamiast 2 dla pętli
- 6. Niestandardowy nagłówek AngularJS $ http dla wszystkich żądań
- 7. AngularJS - ustaw nagłówek HTTP dla żądania GET
- 8. angularjs: $ http Synchroniczne wywołanie
- 9. Jak napisać metodę repozytorium dla .ThenInclude w EF Core 2
- 10. angularjs $ http niezdefiniowany
- 11. AngularJS, $ http i transformResponse
- 12. Czy możemy napisać test jednostkowy dla AngularJS routeProvider?
- 13. prawidłowego użytkowania dla Kątowymi wyniku 2 http
- 14. AngularJS: serwis fabryczny $ http
- 15. opóźnić angularjs $ http serwis
- 16. Kątowy 2 pasek postępu HTTP
- 17. AngularJS: to 0 == 2?
- 18. Przechwytywacz odpowiedzi testu z jaśminem kątowym
- 19. Ustawianie globalnych nagłówków angularjs $ http
- 20. Ionic 1 AngularJs 1 kontra Ionic 2 AngularJs 2?
- 21. Przechwytywacz tokenów Struts2: ochrona CSRF
- 22. kątowa 2 http withCredentials
- 23. AngularJS 2: Obsługa konfiguracji aplikacji dla różnych środowisk
- 24. Jak napisać/odczytać/wysłać ramkę danych za pomocą HTTP/2 w Golang?
- 25. Obietnice AngularJS - Symulacja obietnicy http
- 26. Jak podłączyć AngularJS 2 do REST-API?
- 27. Jak napisać schemat JSON dla tablicy obiektów?
- 28. synchroniczne połączenie http w angularJS
- 29. AngularJS - dostęp do nagłówków HTTP
- 30. Jak napisać widok Django dla żądania POST
Powinieneś rzucić okiem na ten dokument https://github.com/angular/http/issues/80. Angular2 Http przechwytywacze i transformatory są obecnie mocno dyskutowane. Jeśli potrzebujesz przekierować nieuwierzytelnionego użytkownika, poleciłbym tę stronę serwera (z wyjątkiem SPA). – Antoine