0

webView とバックグラウンド呼び出しの両方を含む Appcelerator の Titanium で Android アプリを作成しているときに、複数の createHTTPClient 呼び出しで Cookie が破損するという問題/バグに遭遇しました。

Cookie は、もともと 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 文字または .xml 内の何かと関係があると思われcreateHTTPClientます。auth=破損した Cookie には2 つのステートメントが示されています。

要約すると、アプリの最初の起動時にバックグラウンドTitanium.Network.createHTTPClient呼び出しが機能し、その後の呼び出しは破損した Cookie を送信しているように見えます。

4

1 に答える 1

1

HTTPClient のドキュメントには、「オブジェクトは単一のリクエストに使用されることを意図している」と記載されているため、複数の呼び出しの後にすべてがリセットされると想定しました。しかし、最初の電話の後、何かが違いました。

loader.clearCookies(base_url);Cookie を設定する前にコードに追加すると、問題が解決するようです。

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(); 
于 2013-01-03T15:18:44.163 に答える