Javascript 使用AngularJS忽略HTTP标头中的Set Cookie
我正在开发一个基于客户端AngularJS和服务器端Java for my API(Tomcat+Jersey for WS)的应用程序 我的API的某些路径受到限制,如果用户没有会话,则返回的响应状态为401。在客户端,401HTTP状态被截获,以将用户重定向到登录页面 一旦用户通过身份验证,我就在服务器端创建一个会话 httpRequest.getSession(true); 有没有办法让套装饼干正常工作? 这是与AngularJS相关的问题吗 添加意味着浏览器不应该让插件和JavaScript看到cookie。这是最新的安全浏览约定。应该用于J_SESSIONID,但可能不在这里。我找到了一个帮助我前进的方法 似乎Javascript 使用AngularJS忽略HTTP标头中的Set Cookie,javascript,angularjs,cookies,setcookie,Javascript,Angularjs,Cookies,Setcookie,我正在开发一个基于客户端AngularJS和服务器端Java for my API(Tomcat+Jersey for WS)的应用程序 我的API的某些路径受到限制,如果用户没有会话,则返回的响应状态为401。在客户端,401HTTP状态被截获,以将用户重定向到登录页面 一旦用户通过身份验证,我就在服务器端创建一个会话 httpRequest.getSession(true); 有没有办法让套装饼干正常工作? 这是与AngularJS相关的问题吗 添加意味着浏览器不应该让插件和JavaScri
“访问控制允许凭据”:未在客户端设置true
。
忽略指令$httpProvider.defaults.withCredentials=true
我用配置参数中的{withCredentials:true}替换$resource调用,使用一个简单的$http调用。我解决了一个与您非常相似的问题。 我的剧本!后端试图设置一个会话Cookie,但我无法在Angular中捕获或通过浏览器存储该Cookie 事实上,这个解决方案涉及到一点这个和一点那个。
假设您已经解决了初始问题(只能通过向Access Control Allow Origin添加特定域并删除通配符来解决),接下来的步骤是:
Set Cookie
头中删除HTTP,否则您将永远无法接收由您的代码“生成”的Cookie此设置将在Firefox中运行,但不在Chrome中运行
.domain.com
,而不是ws.domain.com
b) 然后,您需要调用cookie中指定的域,否则Chrome将不会存储您的cookie
[可选]我将删除该/api
路径以支持/
这应该是关键。
希望对您有所帮助您需要同时在服务器端和客户端进行工作 客户端 通过以下方法之一将
$http
configwithCredentials
设置为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;
}
};
}
]);
}
]);
在客户端的post请求中,将响应标题
访问控制允许凭据
设置为真
,确保添加以下内容:
对于jquery ajax请求:
$.ajax({
url:“http://yoururlgoeshere",
类型:“post”,
数据:“somedata”,
xhrFields:{
证书:正确
}
});代码>刚刚解决了这样一个问题
我在做这件事,但没有工作…:
$cookies.put('JSESSIONID', response.data);
Cookie保存在浏览器中,但当我发送新请求时,所有Cookie都被发送,而我的请求除外。(我的cookie是JSESSIONID)
然后我查看chrome inspector,发现了以下内容:
问题是这不是正确的路径
然后我尝试了这个,我的饼干被送去了。耶
$cookies.put('JSESSIONID', response.data, {'path':'/'});
我不知道这是否是你的情况,但这对我很有效
问候 即使HttpOnly属性不存在,也不会在客户端设置cookie。是否确定?它是仅用于/api/的会话cookie。一个实验是对链接使用response.encodeURL
。第一个答案可能仍然使用“…?JSESSIONID=…”而不是cookie。但是后续调用应该设置cookie。您是否在浏览器中查找cookie?是的,当我使用Chrome查看cookie是否在浏览器中设置和/或是否存在于请求和响应标题中时。cookie仅用于会话是。我不知道是否未设置localhost/api的cookie。您可以尝试删除HttpOnly(这很有趣),或者将cookie设置为localhost/而不是localhost/api(不太可能);如果您希望浏览器能够在随后的XHR调用中存储和使用Cookie,请使用Set Cookie(如果有)。如果您找到了解决方案,请不要忘记发布答案。如果您的客户端是移动的,并且您正在使用phonegap/cordova或本机客户端,您是否尝试覆盖源站/参照者标题并使用恒定的源站?您可以在后端获取源站,然后发送相关标题。下面是一个express.js示例:var origin=req.headers.origin;res.header(“访问控制-允许-来源”,来源);您似乎同时发布了一个答案和一个问题作为答案。要提出新问题,请使用页面顶部的“提问”按钮。如果此问题有助于提供上下文,您可以链接到此问题。您必须显式返回“访问控制允许来源”的正确域,当“访问控制允许凭据”为true时为“”。不允许使用星号。因此,如果允许多个来源,人们要做的是让函数拦截请求来源,验证该来源是否在允许列表中,并在“访问控制允许来源”中设置请求来源。e、 g.我希望localhost和example.com能够正常工作。因此,当一个请求从localhost传入时,我的头必须是“Access Control Allow Origin”,“localhost”,例如.com“Access Control Allow Origin”,“example.com”,我不确定它是否仍然相关,但让API依赖于状态是一个糟糕的设计选择(tm)。你应该使你的API无状态以避免将来的问题。我相信问题在于路径是/API,当你说“使用你的WS“托管”的域从cookie中的localhost发送不同的域”时,路径应该是/你说的是前端主机还是后端主机?通常它应该是你的后端,但这实际上取决于
$cookies.put('JSESSIONID', response.data);
$cookies.put('JSESSIONID', response.data, {'path':'/'});