2016-11-25 9 views
6

Uygulamamdaki üçüncü taraf REST hizmetlerinden sonuçları alıyorum. Bu hizmetler, Request header field X-XSRF-TOKEN is not allowed by Access-Control-Allow-Headers in preflight response. ile durur, çünkü angular2, bu başlığı varsayılan başına tüm isteklere standart olarak ayarlamıştır.Açısal 2 XSRFStrategy ürününü tek bir hizmet veya istek için devre dışı bırakın

Bunu devre dışı bırakma anladım:

import { HttpModule, XSRFStrategy } from '@angular/http'; 

export class NoXSRFStrategy { 
    configureRequest(req: Request) { 
    // Remove `x-xsrf-token` from request headers 
    } 
} 
@NgModule({ 
    imports: [ 
    HttpModule 
    ], 
    declarations: [ ], 
    providers: [{ provide: XSRFStrategy, useFactory:() => new NoXSRFStrategy() }] // !!HACK!! 
}) 
export class AppModule { } 

Ama bu ne olursa olsun hizmet bunları sağlayan tüm istekler için bu devre dışı bırakır, yani bir modül düzeyinde çalışır.

İstediğim şey, hangi Http çağrısının bu tür başlıklardan çıkarılması gerektiğine ve bunları kullanmaya devam edebileceğine karar vermektir. Yukarıdaki çözümle hizmeti ayrı bir modülde ayırmam ve sadece bu modül için NoXSRFStrategy kullanmam gerekiyor. Bunu diğer modüllerdeki diğer hizmetlerle birlikte test etmedim, ancak umarım bu, global bir istek yapılandırması olarak NoXSRFStrategy'u ayarlamaz.

@Injectable() 
export class MyService { 

    constructor(private http: Http) { } 
    apiCall() { 
    return this.http.get('some.online/service.json', {useXsrf: false}); // ...or something... IDK 
    } 

Ya da belki hizmet düzeyine:

Sadece ben mümkün olmak istiyorum neyi göstermek için X-XSRF- devre dışı bırakmanın bir yolu var olup olmadığını

@Injectable() 
export class MyService { 

    constructor(private http: Http) { 
    this.http.setXsrfStrategy(NoXSRFStrategy); // For only this http instance... 
    } 

bilen var mı Bir modül seviyesi yapılandırması ayarlamak dışında TOKEN başlığı?

+0

Aynı sorunu burada yaşıyor. Çözebilir misin? – Sebastian

+0

Tüm uygulamam için bu genel olarak ayarlamak istemedim ve açısal uygulama ile üçüncü taraf sunucu arasındaki iletişim kutusunu işlemek için küçük bir NodeJS Express sunucusu oluşturmayı sonlandırdım. Ancak, uygulamanızın yaptığı tüm istekler için X-XSRF-TOKEN'i kaldırmaya özen göstermezseniz, yukarıdaki ilk kod bloğu sizin için hile yapar. –

cevap

1

Bunu çözdüm!

Varsayılan Http sınıfını kendi başınıza geçersiz kılabilirsiniz. Bu Http keseni I got en yakın olan:

onunla belirteci göndermek durdurabilir

@NgModule({ 
    declarations: [AppComponent], 
    imports: [HttpModule], 
    providers: [{ provide: Http, useClass: AuthHttp }], 
    bootstrap: [AppComponent] 
}) 
export class AppModule { } 

AuthHttp.ts

import {Injectable} from '@angular/core'; 
import {Http, Request, Response, RequestOptionsArgs, RequestOptions, XHRBackend} from '@angular/http'; 
import {Router} from '@angular/router'; 
import {Observable} from 'rxjs/Observable'; 
import 'rxjs/add/observable/throw'; 

@Injectable() 
export class AuthHttp extends Http { 
    constructor(backend: XHRBackend, defaultOptions: RequestOptions) { 
    super(backend, defaultOptions); 

    // Setup default http headers here 
    defaultOptions.headers.append('Cache-control', 'no-cache'); 
    defaultOptions.headers.append('Cache-control', 'no-store'); 
    defaultOptions.headers.append('Pragma', 'no-cache'); 
    defaultOptions.headers.append('Expires', '0'); 
    } 

    request(url: string | Request, options?: RequestOptionsArgs): Observable<Response> { 
    // Before request execution. You can manipulate headers per request here. 

    return super.request(url, options) 
     .map(res => { // Successful Response 
     return res; 
     }) 
     .catch((err: any) => { // Unsuccessful Response. 
     return Observable.throw(err); 
     }); 
    } 
} 
-1

app.module.ts.

document.cookie = "XSRF-TOKEN=; path=/" // <- add this 
this.http.get(url, options) 

"XSRF-TOKEN" adında bir tanımlama bilgisini temizleyin.

Ve ben genişletilmiş Http sınıfı yaptık, bu da belirteci göndermeyi seçebilir veya yapamaz.

İlgili konular