从XHR请求/响应中读取/写入cookie(PhoneGap / Cordova)

时间:2015-05-03 07:27:34

标签: cordova http cookies xmlhttprequest phonegap-plugins

我正在使用$ 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,但我不介意使用别的东西,只要它可以从客户端(浏览器)工作。

1 个答案:

答案 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插件非常易于设置,并且功能非常强大,因为您可以获得所有原生功能。