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

4
我正在使用 $http(Angular) 并向我无法控制的远程网站发布文章。
在登录时,它会给我一个“site_session” cookie,我想读取它。 请注意,由于运行于移动设备上的 Cordova 应用程序中,因此我能够调用远程网站(跨域)。
我尝试了各种在网上找到的解决方案,但没有成功。
我正在使用 Angular 1.3.13,因此应该可以在 $timeout 后使用 $cookies,但实际上不行。
我尝试了 withCredentials = true 技巧,既在 $httpProvider.defaults 中,也在 $http 调用的 config 中自己设置:都不行。 $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: Object {myTest2: "test2"}

我只得到了最后一个设置的cookie,而没有任何真正的cookie…

我已经没有任何解决方案了。有人能提供一种有效的方法来从Angular在Cordova应用程序中调用远程(跨域)站点的cookie吗?
如果可能,我希望保留$http,但只要它可以从客户端(浏览器)工作即可使用其他东西。


远程站点是什么意思? - Robin-Hoodie
我认为OP的意思是从HTTP响应中获取Set-Cookie头信息。我认为你可以直接解析这个头信息。 - David S.
@NexusDuck 远程站点意味着不是本地主机请求。@davidshen84 不幸的是,标题没有 Set-Cookie,这可能是因为出于安全考虑或者在成功登录后实际上跟随重定向到另一个页面时被移除了,最后一次调用没有 Set-Cookie 标头。 - Thomas
使用像Fiddler这样的HTTP调试代理查看流量,以查看cookie。带有HttpOnly属性的Cookie在JavaScript中是看不到的。 - Jesús López
我认为这不是“JavaScript”的问题,因为我可以使用nodejs服务器端JavaScript查看cookie。是的,如果我监视我的网络,我也可以看到cookie,但这并不能帮助我在我的angular应用程序中获取cookie... - Thomas
经过更多的研究,似乎无法从移动Web应用程序(通过Cordova)中的XHR请求访问cookie。太糟糕了,我必须使用代理服务来解决这个问题... - Thomas
1个回答

4

我确认在PhoneGap / Cordova上,无论使用什么框架,JavaScript的XMLHttpRequest对象都无法管理cookie(这不是angular问题)。

看起来这是一个特性而不是一个错误,并且没有计划将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插件非常容易设置,并且非常强大,因为您可以获得所有本机可能的功能。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接