Deskripsi
Solusi terbaik yang saya temukan adalah menimpa XHRBackendstatus respons HTTP 401dan 403mengarah ke tindakan tertentu.
Jika Anda menangani otentikasi Anda di luar aplikasi Angular Anda, Anda dapat memaksa menyegarkan halaman saat ini sehingga mekanisme eksternal Anda dipicu. Saya merinci solusi ini dalam implementasi di bawah ini.
Anda juga bisa meneruskan ke komponen di dalam aplikasi Anda sehingga aplikasi Angular Anda tidak dimuat ulang.
Penerapan
Sudut> 2.3.0
Berkat @mrgoos, berikut adalah solusi yang disederhanakan untuk angular 2.3.0+ karena perbaikan bug di angular 2.3.0 (lihat masalah https://github.com/angular/angular/issues/11606 ) memperluas Httpmodul secara langsung .
import { Injectable } from '@angular/core';
import { Request, XHRBackend, RequestOptions, Response, Http, RequestOptionsArgs, Headers } from '@angular/http';
import { Observable } from 'rxjs/Observable';
import 'rxjs/add/operator/catch';
import 'rxjs/add/observable/throw';
@Injectable()
export class AuthenticatedHttpService extends Http {
constructor(backend: XHRBackend, defaultOptions: RequestOptions) {
super(backend, defaultOptions);
}
request(url: string | Request, options?: RequestOptionsArgs): Observable<Response> {
return super.request(url, options).catch((error: Response) => {
if ((error.status === 401 || error.status === 403) && (window.location.href.match(/\?/g) || []).length < 2) {
console.log('The authentication session expires or the user is not authorised. Force refresh of the current page.');
window.location.href = window.location.href + '?' + new Date().getMilliseconds();
}
return Observable.throw(error);
});
}
}
File modul sekarang hanya berisi penyedia berikut.
providers: [
{ provide: Http, useClass: AuthenticatedHttpService }
]
Solusi lain yang menggunakan Router dan layanan otentikasi eksternal dirinci dalam inti berikut oleh @mrgoos.
Angular sebelum 2.3.0
Implementasi berikut bekerja untuk Angular 2.2.x FINALdan RxJS 5.0.0-beta.12.
Ini mengalihkan ke halaman saat ini (ditambah parameter untuk mendapatkan URL unik dan menghindari caching) jika kode HTTP 401 atau 403 dikembalikan.
import { Request, XHRBackend, BrowserXhr, ResponseOptions, XSRFStrategy, Response } from '@angular/http';
import { Observable } from 'rxjs/Observable';
import 'rxjs/add/operator/catch';
import 'rxjs/add/observable/throw';
export class AuthenticationConnectionBackend extends XHRBackend {
constructor(_browserXhr: BrowserXhr, _baseResponseOptions: ResponseOptions, _xsrfStrategy: XSRFStrategy) {
super(_browserXhr, _baseResponseOptions, _xsrfStrategy);
}
createConnection(request: Request) {
let xhrConnection = super.createConnection(request);
xhrConnection.response = xhrConnection.response.catch((error: Response) => {
if ((error.status === 401 || error.status === 403) && (window.location.href.match(/\?/g) || []).length < 2) {
console.log('The authentication session expires or the user is not authorised. Force refresh of the current page.');
window.location.href = window.location.href + '?' + new Date().getMilliseconds();
}
return Observable.throw(error);
});
return xhrConnection;
}
}
dengan file modul berikut.
import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { HttpModule, XHRBackend } from '@angular/http';
import { AppComponent } from './app.component';
import { AuthenticationConnectionBackend } from './authenticated-connection.backend';
@NgModule({
bootstrap: [AppComponent],
declarations: [
AppComponent,
],
entryComponents: [AppComponent],
imports: [
BrowserModule,
CommonModule,
HttpModule,
],
providers: [
{ provide: XHRBackend, useClass: AuthenticationConnectionBackend },
],
})
export class AppModule {
}