在 Angular2 应用程序和 Java 后端 API 之间实现和处理 CORS 问题时,我已经走到了尽头。
我知道并知道什么是 CORS 请求,已经在 angular1 应用程序中实现,但我无法使其在 Angular2 (Ionic2) 应用程序中工作。
ionic 2 应用程序应该使用现有的 API Web 服务,该服务已经启用了用于发出 CORS 请求的一切,并且身份验证是使用 Http only cookie 完成的......已经在 Angular 1 中实现。
出于某种原因,当我们在请求中设置标头时,Angular2 将“ withCredentials ”标志设置为 false 或根本不发送,并且向 api 发出请求但不返回 cookie……我们无法进行身份验证API 调用。我已经尝试了很多很多东西来将 http 标头和“withCredentials”标志一起发送,但在 Angular2 中似乎没有任何效果,而在 Angular1 中则可以正常工作。我们发送的所有标头都是服务器允许的,它们在响应中的“Access-Control-Allow-Headers”中返回。
有趣的是,如果我尝试仅使用“withCredentials”标志发送请求,则请求发送正常,并且浏览器正确设置了 cookie。
我尝试过以下事情:
创建自定义 http 类,如下所述:http: //www.adonespitogo.com/articles/angular-2-extending-http-provider/
扩展类似 BrowserXhr 类并将“withCredentials”设置为 true,如下所述:Angular 2 - http get withCredentials
直接在 RequestOptions 中设置,如下所示: angular 2 http withCredentials
像这里一样扩展 BaseRequestOptions (RequestOptions): Angular2 - 为每个请求设置标头
示例代码:
import { Injectable } from '@angular/core';
import { Headers, RequestOptions } from '@angular/http';
@Injectable()
export class DefaultRequestOptions extends RequestOptions {
withCredentials:boolean = true;
// headers:Headers = new Headers({
// 'Accept': 'application/json, text/plain, */*',
// 'Authorization': 'sometoken',
// });
constructor() {
super();
if(!this.headers){
this.headers = new Headers();
}
this.headers = new Headers();
this.headers.append('Accept','application/json');
this.headers.append('CustomHeader',"someTokenGoesHere");
this.withCredentials = true;
}
}
稍后在模块中:
@NgModule({
declarations: [
MyApp
],
imports: [
IonicModule.forRoot(MyApp,{tabsHideOnSubPages:true})
],
bootstrap: [IonicApp],
entryComponents: [
MyApp
],
providers: [
{ provide: RequestOptions, useClass: DefaultRequestOptions }
]
})
也试过这样:
let headers = new Headers();
headers.append("Accept",'application/json');
headers.append("CustomHeader",'someTokenGoesHere');
let options = new RequestOptions({ headers: headers, withCredentials: true});
this.http.get('apiurl',options).subscribe((res)=>{ console.log(res)})
如果有人成功结合了 http 标头和 withCredentials 标志,请分享您的经验。
更新: 我没有找到解决这个问题的方法,所以我们决定删除一些安全头并对请求进行 IP 地址过滤。通过这种方式,我们不需要发送任何额外的 http 标头并继续使用 httponly cookie。