AngularJS会忽略HTTP标头中的Set-Cookie

我正在处理基于客户端上的AngularJS和我的API(服务器端的Tomcat + Jersey)的Java应用程序。

我的API的某些path是受限制的,如果用户没有会话,则返回的响应状态是401.在客户端,截获401 http状态以将用户redirect到login页面。

一旦用户通过身份validation,我在服务器端创build一个会话

  httpRequest.getSession(真); 

并且发送给客户端的响应在其头部中具有Set-cookie指令:

设置Cookie:JSESSIONID = XXXXXXXXXXXXXXXXXXXXX; 域本地主机=; path= / API /; 仅Http

问题是cookie不会放在客户端。 当我检查cookie的localhost域是空的,所以下一个请求没有这个cookie的头,客户端仍然无法访问我的API的受限制的path。

客户端和服务器在同一个域中,但它们没有相同的path和相同的端口号:

客户端: http://localhost:8000/app/index.html

服务器: http://localhost:8080/api/restricted/

附加信息:在两侧启用CORS:

  “Access-Control-Allow-Methods”,“GET,POST,OPTIONS”
 “Access-Control-Allow-Origin”,“*”
 “Access-Control-Allow-Credentials”,true 

任何想法使Set-Cookie正常工作? 这是一个AngularJS相关的问题?

我在AngularJS中发现了一个帮助我前进的问题。

看来"Access-Control-Allow-Credentials" : true在客户端没有设置。 指令$httpProvider.defaults.withCredentials = true被忽略。

我用configuration参数中的{withCredentials:true}通过简单的$ http调用来replace$ resource调用。

我已经设法解决了一个非常类似于你的问题。 我玩! 后端试图设置一个会议Cookie,我无法在Angular中捕获或通过浏览器存储。

其实解决scheme涉及到这一点和一点点。

假设您已经解决了初始问题,只能通过将特定域添加到Access-Control-Allow-Origin并删除通配符来解决,接下来的步骤是:

  1. 您必须从Set-Cookie头中删除仅限HTTP,否则您将永远无法收到由angular码“生成”的cookie
    这个设置已经可以在Firefox中使用了,不过在Chrome中不行

  2. 为了使其也适用于Chrome,您需要:

    a)从cookie中的本地主机发送一个不同的域,使用你的WS“托pipe”的域。 你甚至可以使用通配符,如ws.domain.com而不是ws.domain.com

    b)那么您需要拨打cookie中指定的域名,否则Chrome将不会存储您的cookie

    [可选]我会删除该/apipath有利于一个/

这应该是诀窍。
希望能有一些帮助

在客户端的发布请求中,请确保添加以下内容:

对于jQuery的Ajax请求:

 $.ajax({ url: "http://yoururlgoeshere", type: "post", data: "somedata", xhrFields: { withCredentials: true } }); 

另外HttpOnly意味着浏览器不应该让插件和JavaScript看到cookie。 这是安全浏览的最新惯例。 应该用于J_SESSIONID,但也许不在这里。

您需要在服务器和客户端上工作。

客户

通过以下方式之一将$http config withCredentials设置$http true

  1. 每个请求

     var config = {withCredentials: true}; $http.post(url, config); 
  2. 对于所有请求

     angular.module("your_module_name").config(['$httpProvider', function($httpProvider) { $httpProvider.interceptors.push(['$q', function($q) { return { request: function(config) { config.withCredentials = true; return config; } }; } ]); } ]); 

服务器

将响应头Access-Control-Allow-Credentialstrue

刚刚解决了这样的问题。

我正在这样做,而不是工作…:

  $cookies.put('JSESSIONID', response.data); 

Cookies保存在浏览器中,但是当我发送一个新的请求时,所有的cookies都被发送出去了。 (我的cookie是JSESSIONID)

然后我看着铬检查员,我发现这个: 我的会话是JsessionID

问题是不是正确的path!

然后我尝试了这个,我的cookies被发送了。 好极了! :

 $cookies.put('JSESSIONID', response.data, {'path':'/'}); 

我不知道这是你的情况,但是这对我有效。

问候!