【问题标题】:Set-cookie in response not set for Angular2 post request未为Angular2发布请求设置响应的设置cookie
【发布时间】:2016-05-06 00:21:53
【问题描述】:

当我在 Angular2 中发出 put 请求时,我在响应中收到了预期的 set-cookie。但是我的浏览器(Chrome 和 Firefox 都试过)拒绝设置 cookie。

当我使用 Angular 1 应用程序调用 same API 端点时,cookie 设置正确。

响应头是:

Access-Control-Allow-Credentials:true
Access-Control-Allow-Origin:http://example.com
Allow:GET, PUT, HEAD, OPTIONS
Content-Type:application/json
Date:Thu, 28 Jan 2016 14:41:38 GMT
P3P:policyref="http://www.example.com/p3p.xml", CP="NON DSP COR CURa TIA"
Server:WSGIServer/0.1 Python/2.7.6
Set-Cookie:sessionid=994wl49qfsizog5bqmt57sgx9q2toa25; expires=Mon, 28-Mar-2016 14:41:37 GMT; Max-Age=5183999; Path=/
Set-Cookie:csrf=u7UQhpAphTsGYKRU6jFlLFt6NoYAhNMS; Domain=api.example.com; expires=Thu, 26-Jan-2017 14:41:38 GMT; Max-Age=31449600; Path=/
Vary:Accept, Cookie

后端是在 Django 1.8 中编写的。

有没有人遇到过同样的事情或有如何解决这个问题的建议?

【问题讨论】:

    标签: angular cookies


    【解决方案1】:

    我似乎是一个与 CORS 相关的问题。也许你可以尝试在执行 HTTP 请求时设置withCredentials 属性。

    此答案可以帮助您了解如何做到这一点,尤其是 Cedric Exbrayat 的答案:

    编辑

    你可以扩展BrowserXhr:

    @Injectable()
    export class CustomBrowserXhr extends BrowserXhr {
      constructor() {}
      build(): any {
        let xhr = super.build();
        xhr.withCredentials = true;
        return <any>(xhr);
      }
    }
    

    并使用扩展覆盖BrowserXhr 提供程序:

    bootstrap(AppComponent, [
      HTTP_PROVIDERS,
      provide(BrowserXhr, { useClass: CustomBrowserXhr })
    ]);
    

    如果您需要有关 CORS 的更多提示,可以查看此链接:http://restlet.com/blog/2015/12/15/understanding-and-using-cors/

    希望对你有帮助 蒂埃里

    【讨论】:

    • 谢谢!但对我来说,我必须把 Cedric 的代码放在哪里还不是很清楚 :)
    • 我认为 Cédric 的代码应该放在调用 bootstrap 函数之前。我还为您提供了另一种可行的方法,但我没有对其进行测试...
    • 我最终把它放在了我的 api 服务的构造函数中。谢谢! :)
    • @osi 我可以看看你如何做到这一点的例子吗?
    【解决方案2】:

    确实是 CORS 问题。 从 Angular2 RC2 开始,你只需要

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

    【讨论】:

    • 对应的 Angular 2 文档:angular.io/docs/ts/latest/api/http/index/…
    • 请注意,对于像我这样在这里和其他任何地方读得太快的人来说——这只是 Angular 使用的设置,并且作为用于传递标头的同一对象的属性给出。 它本身不是标题。
    【解决方案3】:

    我遇到了同样的问题,但对我来说,cookie 有一个指向“/api/order”的路径。所以只有对该路径的请求包含 cookie。我将路径更改为“/”,现在一切都很好。 .

    【讨论】:

      猜你喜欢
      • 2017-03-10
      • 2017-12-22
      • 2021-04-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-05
      • 1970-01-01
      • 2019-08-19
      相关资源
      最近更新 更多