我正在使用$ http(有角度)并发布到我无法控制的远程网站 登录时,它会给我一个我想读的“site_session”cookie。 请注意,我可以拨打远程网站(跨域),因为在移动设备上运行Cordova应用程序。
我尝试了在网上找到的各种解决方案,没有任何运气
我正在使用Angular 1.3.13,因此$cookies
之后的$timeout
应该可以正常工作,但不会。
我在$ httpProvider.defaults和$ http调用的配置本身中尝试了withCredentials = true
技巧:没有运气。
$ cookies似乎死亡并在每个范围内重置。
例如:
$http({
method: 'POST',
url: 'http://distantsite.com/login.php',
data: 'username=test&password=test',
headers: {
'Accept': 'text/html',
'Cookie': "site_session=abcd", // this will be blocked: refused to set unsafe header
'Content-Type': 'application/x-www-form-urlencoded',
'Access-Control-Allow-Credentials': true,
},
withCredentials: true,
}).success(function(response, status, headers){
$cookies.myTest1 = 'test1';
$log.info('cookies: ', $cookies); // Object {myTest1: "test1"}
$timeout(function(){
$cookies.myTest2 = 'test2';
$log.info('cookies after timeout: ', $cookies); // Object {myTest2: "test2"}, myTest1 has disappeared!
});
});
输出:
cookies: Object {myTest1: "test1"}
cookies after timeout: Object {myTest2: "test2"}
我没有得到任何真正的饼干,只有我设置的最后一个......
我完全没有解决方案。有没有人有一种有效的工作方式来检索Cordova应用程序中Angular对远程(跨域)站点的调用的cookie?
如果可能的话,我想保留$ http,但我不介意使用别的东西,只要它可以从客户端(浏览器)工作。
答案 0 :(得分:4)
我确认无法使用Android上的PhoneGap / Cordova中的JavaScript的XMLHttpRequest对象管理cookie,无论使用何种框架(因此不是角度问题)。
它似乎是一个功能,而不是一个 bug ,没有计划将cookie暴露给JavaScript方面(cookie 是管理但是只是没有暴露给Cordova的JavaScript客户端。)
iOS上似乎有一种解决方法,但我无法确认。
我发现Android的唯一解决方法是创建一个Cordova插件,它本地执行HTTP调用(在Android上使用java.net。*),允许访问cookie并将它们传回JavaScript端。
有关详细信息,请查看Cordova插件文档:http://docs.phonegap.com/en/4.0.0/guide_hybrid_plugins_index.md.html
幸运的是,Cordova插件非常易于设置,并且功能非常强大,因为您可以获得所有原生功能。