Açıklama
Bulduğum en iyi çözüm XHRBackend, HTTP yanıt durumu 401ve 403belirli bir eyleme yol açacak şekilde geçersiz kılmaktır.
Kimlik doğrulamanızı Angular uygulamanızın dışında gerçekleştirirseniz, harici mekanizmanız tetiklenecek şekilde mevcut sayfayı yenilemeye zorlayabilirsiniz. Bu çözümü aşağıdaki uygulamada detaylandırıyorum.
Angular uygulamanız yeniden yüklenmeyecek şekilde uygulamanızın içindeki bir bileşeni de iletebilirsiniz.
Uygulama
Açısal> 2.3.0
@Mrgoos sayesinde, doğrudan modülü genişleten açısal 2.3.0'daki bir hata düzeltmesi ( https://github.com/angular/angular/issues/11606 konusuna bakın ) nedeniyle açısal 2.3.0+ için basitleştirilmiş bir çözüm burada Http.
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);
});
}
}
Modül dosyası artık yalnızca aşağıdaki sağlayıcıyı içerir.
providers: [
{ provide: Http, useClass: AuthenticatedHttpService }
]
Yönlendirici ve harici bir kimlik doğrulama servisi kullanılarak Başka bir çözüm, aşağıdaki ayrıntılı olarak ana fikri @mrgoos ile.
Açısal ön-2.3.0
Aşağıdaki uygulama Angular 2.2.x FINALve için çalışır RxJS 5.0.0-beta.12.
401 veya 403 HTTP kodu döndürülürse, geçerli sayfaya (ayrıca benzersiz bir URL almak ve önbelleğe almayı önlemek için bir parametre) yönlendirir.
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;
}
}
aşağıdaki modül dosyası ile.
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 {
}