【问题标题】:Cookie corruption with multiple createHTTPClient Titanium calls多个 createHTTPClient Titanium 调用导致 Cookie 损坏
【发布时间】:2013-01-03 23:18:44
【问题描述】:

在 Appcelerator 的 Titanium 中创建一个涉及 webView 和后台调用的 Android 应用程序时,我遇到了一个问题/错误,即 cookie 在多个 createHTTPClient 调用中被损坏。

Cookies 最初是从 webView 获取的:

var webview = Ti.UI.createWebView();
webview.url = 'http://www.example.com';
window.add(webview);
webview.addEventListener('load', function(e) {
    cookies = e.source.evalJS("document.cookie");
    Titanium.App.Properties.setString('cookies',cookies);
}
window.open({modal:true});

然后与后台调用一起使用:

var loader = Titanium.Network.createHTTPClient();  
loader.open("GET",base_url + url); 
loader.onload = function() {
    // process response
}
loader.setRequestHeader('Cookie',Titanium.App.Properties.getString("cookies"));
loader.send(); 

第一次调用上述 createHTTPClient 代码块时,一切正常,但随后运行上述代码会发送损坏的 cookie。在 Google App Engine (gae) 中,打印出请求标头将如下所示(已损坏):

logging.info('Request:\n%s' % self.request)

响应中断(仅显示请求标头的 cookie 部分)

Cookie: auth="eyJfdXNlciI6WzYsMSwiVmRoZEtnYWZRMnNxazFjaVM0U1lKdCIsMTM1NzIyMzcwOSwxMzU3MjIzNzA5XX0\075|1357223709|4f622167f477a8c82cab196af4b0029af1a966d7", auth=eyJfdXNlciI6WzYsMSwiVmRoZEtnYWZRMnNxazFjaVM0U1lKdCIsMTM1NzIyMzcwOSwxMzU3MjIzNzA5XX0\075|1357225569|7a469fab7a38a437649c25620729e07c4607f617 Cookie2: $Version=1

工作响应

Cookie: auth="eyJfdXNlciI6WzYsMSwiVmRoZEtnYWZRMnNxazFjaVM0U1lKdCIsMTM1NzIyMzcwOSwxMzU3MjIzNzA5XX0\075|1357223709|4f622167f477a8c82cab196af4b0029af1a966d7" ...

我怀疑该问题与 unicode 字符或 createHTTPClient 中的某些内容有关。损坏的 cookie 中显示了两个 auth= 语句。

总而言之,当应用首次启动时,后台 Titanium.Network.createHTTPClient 调用正常工作,之后的任何调用似乎都会发送损坏的 cookie。

【问题讨论】:

    标签: android google-app-engine cookies titanium appcelerator


    【解决方案1】:

    HTTPClient documentation 表示“对象旨在用于单个请求”,因此我假设在多次调用后一切都会重置。但在第一次通话后情况有所不同。

    在设置 cookie 之前将loader.clearCookies(base_url); 添加到代码中似乎可以解决问题。

    var loader = Titanium.Network.createHTTPClient();  
    loader.open("GET",base_url + url); 
    loader.onload = function() {
        // process response
    }
    loader.clearCookies(base_url); // THE FIX.
    loader.setRequestHeader('Cookie',Titanium.App.Properties.getString("cookies"));
    loader.send(); 
    

    【讨论】:

      猜你喜欢
      • 2015-02-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多