我从应用程序中的第三方REST服务获取结果。这些服务停滞不前
Request header field X-XSRF-TOKEN is not allowed by Access-Control-Allow-Headers in preflight response.
因为angular2已将此标头设置为默认情况下所有请求的标准。
我已经弄明白了如何禁用它:
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 { }
但这适用于模块级别,这意味着它会对所有请求禁用此功能,无论哪个服务提供它们。
我想要的是,为自己决定哪个Http调用应该被剥夺这样的标题,哪些可以继续使用它们。通过上面的解决方案,我必须在单独的模块中隔离服务,并仅将NoXSRFStrategy
用于此模块。我还没有结合其他模块中的其他服务对此进行测试,但我希望这不会将NoXSRFStrategy
设置为全局请求配置。
只是为了说明我希望的可能性:
@Injectable()
export class MyService {
constructor(private http: Http) { }
apiCall() {
return this.http.get('some.online/service.json', {useXsrf: false}); // ...or something... IDK
}
或者也许是在服务级别:
@Injectable()
export class MyService {
constructor(private http: Http) {
this.http.setXsrfStrategy(NoXSRFStrategy); // For only this http instance...
}
除了设置模块级配置之外,有没有人知道是否有任何方法可以禁用X-XSRF-TOKEN标头?
答案 0 :(得分:1)
我明白了!
您可以使用自己的Http类覆盖默认的Http类。这是我最接近Http拦截器的地方:
<强> app.module.ts 强>
@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 :(得分:-2)
我可以停止发送令牌。
document.cookie = "XSRF-TOKEN=; path=/" // <- add this
this.http.get(url, options)
只需清除名为&#34; XSRF-TOKEN&#34;。
的Cookie我已经制作了一个扩展的Http类,可以选择是否发送令牌。