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并删除通配符来解决,接下来的步骤是:
-
您必须从
Set-Cookie
头中删除仅限HTTP,否则您将永远无法收到由angular码“生成”的cookie
这个设置已经可以在Firefox中使用了,不过在Chrome中不行 -
为了使其也适用于Chrome,您需要:
a)从cookie中的本地主机发送一个不同的域,使用你的WS“托pipe”的域。 你甚至可以使用通配符,如
ws.domain.com
而不是ws.domain.com
b)那么您需要拨打cookie中指定的域名,否则Chrome将不会存储您的cookie
[可选]我会删除该
/api
path有利于一个/
这应该是诀窍。
希望能有一些帮助
在客户端的发布请求中,请确保添加以下内容:
对于jQuery的Ajax请求:
$.ajax({ url: "http://yoururlgoeshere", type: "post", data: "somedata", xhrFields: { withCredentials: true } });
另外HttpOnly意味着浏览器不应该让插件和JavaScript看到cookie。 这是安全浏览的最新惯例。 应该用于J_SESSIONID,但也许不在这里。
您需要在服务器和客户端上工作。
客户
通过以下方式之一将$http
config withCredentials
设置$http
true
:
-
每个请求
var config = {withCredentials: true}; $http.post(url, config);
-
对于所有请求
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-Credentials
为true
。
刚刚解决了这样的问题。
我正在这样做,而不是工作…:
$cookies.put('JSESSIONID', response.data);
Cookies保存在浏览器中,但是当我发送一个新的请求时,所有的cookies都被发送出去了。 (我的cookie是JSESSIONID)
然后我看着铬检查员,我发现这个:
问题是不是正确的path!
然后我尝试了这个,我的cookies被发送了。 好极了! :
$cookies.put('JSESSIONID', response.data, {'path':'/'});
我不知道这是你的情况,但是这对我有效。
问候!