angular2 xhrfields withcredentials true

时间:2016-01-26 05:32:53

标签: javascript angular http

我正在尝试登录系统。在角度1中,有设置方法

withCredentials:true

但是我找不到angular2

中的工作解决方案
export class LoginComponent {
    constructor(public _router: Router, public http: Http, ) {

    }


    onSubmit(event,username,password) {
        this.creds = {'Email': 'harikrishna@gmail.com','Password': '01010','RememberMe': true}
        this.headers = new Headers();
        this.headers.append('Content-Type', 'application/json');

        this.http.post('http://xyz/api/Users/Login', {}, this.creds)
              .subscribe(res => {
                  console.log(res.json().results);

              });
     }

}

6 个答案:

答案 0 :(得分:8)

在Angular中> 2.0.0(实际上来自RC2),只是

http.get('http://my.domain.com/request', { withCredentials: true })

答案 1 :(得分:5)

AFAIK,现在(beta.1)该选项不可用。

你必须解决这个问题:

let _build = http._backend._browserXHR.build;

http._backend._browserXHR.build = () => {
  let _xhr =  _build();
  _xhr.withCredentials = true;
  return _xhr;
};

答案 2 :(得分:2)

angular2团队已经注意到了这个问题。

您可以在issue link之后找到一些其他解决方法(一种特别是作为@Injectable编写的)。

答案 3 :(得分:1)

如果有人使用普通的JS,基于cexbrayat的答案:

app.Service = ng.core
    .Class({
        constructor: [ng.http.Http, function(Http) {
            this.http = Http;
            var _build = this.http._backend._browserXHR.build;
            this.http._backend._browserXHR.build = function() {
                var _xhr = _build();
                _xhr.withCredentials = true;
                return _xhr;
            };
        }],

答案 4 :(得分:0)

我认为你没有以正确的方式使用post metrhod。你可以试试这样的东西:

onSubmit(event,username,password) {
  this.creds = {
    'Email': 'harikrishna@gmail.com',
    'Password': '01010','RememberMe': true
  }

  this.headers = new Headers();
  this.headers.append('Content-Type', 'application/json');

  this.http.post('http://xyz/api/Users/Login', 
                 JSON.stringify(this.creds),
                 { headers: headers });
}

您可以反转参数。第二个参数对应于要发送到POST的内容,应该定义为字符串。此级别尚不支持对象。请参阅此问题:https://github.com/angular/angular/issues/6538

如果要设置特定标头,则需要在Headers方法的第三个参数中添加post对象。

否则,如果您想在跨域请求中发送cookie,我认为withCredentials属性与CORS相关。您可以查看此链接以获取更多详细信息:

希望它可以帮到你, 亨利

答案 5 :(得分:0)

getHeaders(): RequestOptions {
    let optionsArgs: RequestOptionsArgs = { withCredentials: true }
    let options = new RequestOptions(optionsArgs)
    return options;
  }

getAPIData(apiName): Observable<any> {`enter code here`
    console.log(Constants.API_URL + apiName);
    let headers = this.getHeaders();
    return this.http
      .get(Constants.API_URL + apiName, headers)
      .map((res: Response) => res.json())
  }

1

在webapi中启用了cors

2

相同的代码在chrome(普通),Internet Explorer中可以正常工作

但是它要求Windows登录提示使用隐身的chrome,firefox,edge。 分享建议以解决此问题