বর্ণনা
আমি যে সর্বোত্তম সমাধানটি পেয়েছি তা হ'ল XHRBackend
এইচটিটিপি প্রতিক্রিয়া স্থিতিটিকে ওভাররাইড করা 401
এবং 403
একটি নির্দিষ্ট ক্রিয়ায় নিয়ে যায়।
আপনি যদি আপনার কৌনিক অ্যাপ্লিকেশনটির বাইরে আপনার প্রমাণীকরণটি পরিচালনা করেন তবে আপনি বর্তমান পৃষ্ঠার একটি রিফ্রেশকে বাধ্য করতে পারেন যাতে আপনার বাহ্যিক প্রক্রিয়া ট্রিগার হয়। আমি নীচের বাস্তবায়নে এই সমাধানটি বিশদভাবে জানাচ্ছি।
আপনি নিজের অ্যাপ্লিকেশনের অভ্যন্তরে এমন কোনও উপাদানকেও ফরোয়ার্ড করতে পারেন যাতে আপনার কৌনিক অ্যাপ্লিকেশনটি পুনরায় লোড হয় না।
বাস্তবায়ন
কৌণিক> ২.৩.০
@ মিঃগ্রোগসকে ধন্যবাদ, কৌণিক ২.৩.০ এ বাগ বাগের কারণে এখানে মডিউলটি সরাসরি মডিউলটি প্রসারিত করার জন্য ( https://github.com/angular/angular/issues/11606 ইস্যু দেখুন ) এর জন্য কৌণিক 2.3.0+ এর সরল সমাধান রয়েছে solutionHttp
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);
});
}
}
মডিউল ফাইলটিতে এখন কেবলমাত্র নিম্নলিখিত সরবরাহকারী রয়েছে।
providers: [
{ provide: Http, useClass: AuthenticatedHttpService }
]
রাউটার এবং একটি বহিস্থিত প্রমাণীকরণ পরিষেবা ব্যবহার আরেকটি সমাধান নিম্নলিখিত মধ্যে বিস্তারিত হয় সারকথা @mrgoos দ্বারা।
কৌণিক প্রাক-2.3.0
নিম্নলিখিত বাস্তবায়ন Angular 2.2.x FINAL
এবং জন্য কাজ করে RxJS 5.0.0-beta.12
।
যদি কোনও HTTP কোড 401 বা 403 ফিরে আসে তবে এটি বর্তমান পৃষ্ঠায় পুনর্নির্দেশ করে (কোনও অনন্য ইউআরএল পেতে ক্যাচিং এড়াতে একটি প্যারামিটার) plus
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;
}
}
নিম্নলিখিত মডিউল ফাইল সহ।
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 {
}