9

アプリの onCreate で CookieManager.getInstance().removeAllCookie() を呼び出します。

予期しない Cookie 値が GET 要求で渡されるという奇妙な問題が発生しています。実際、Cookie の値は非常に古い値です。

テストのために実行する手順は次のとおりです。

  1. アプリをインストールする
  2. アプリの起動時に GET リクエストを行います。リクエストはクリーンである必要があります。Cookie は送信されません。
  3. GET リクエストは Set-Cookie で応答します。値はリクエスト時間に基づいているため、この値が 2 つのリクエストで同じになる可能性はほとんどありません。
  4. 別の GET リクエストを作成します。リクエストは、ステップ 3 の Cookie 値を送信する必要があります。

アプリを初めてインストールしたとき、Cookie の動作は上記の期待どおりに機能しました。アプリをアンインストールしてから再インストールしたところ、Cookie の動作が期待どおりに機能しました。私はこれを数回行います。物事は順調でダンディです。

その後、突然、N 回目のインストールで、ステップ 2 がパスしません。最初の GET リクエストはクリーンではありません。実際、アプリの最初のインストール時に設定された値が含まれています。

この問題を確実に再現することはできませんが、かなり頻繁に発生します。インストール時の最初の GET リクエストが、直前のインストールからの Cookie 値を送信しているわけではありません。この値は、アンインストールが続いた 3 つまたは 4 つの以前のインストールからのものです

私がこれを見ている可能性はありますか?アプリのすべての Cookie を実際に削除するにはどうすればよいですか?

4

4 に答える 4

9

これは暗闇の中でのショットですが、最初のインストールの Cookie は永続ストレージにあり、再インストールの Cookie は RAM にキャッシュされている可能性があります。おそらく、すべての Cookie を削除するアクションは、何らかの理由で永続ストレージに同期されていないため、再インストール間で古い値が保持されます。

ドキュメントを引用するCookieSyncManager(強調鉱山):

CookieSyncManager は、RAM と永続的なストレージの間でブラウザーの Cookie ストアを同期するために使用されます。最高のパフォーマンスを得るために、ブラウザの Cookie は RAM に保存されます。timer によって駆動される別のスレッドが Cookie を保存します。

...

同期間隔は 5 分なので、たとえば onPageFinished(WebView, String) などで手動で同期を強制する必要があります。sync() も非同期で発生することに注意してください。アクティビティがシャットダウンしているときに実行しないでください

これは、アプリがアンインストールされたときにまだ同期されていなかったため、最初のインストールからの古い値がまだこの時点で永続ストレージ。また、5 分間の間隔が経過していなければ、アンインストール中に同期が行われると想定する理由もありません。

ここで 1 つの疑問が残りonCreateます。removeAllCookie も非同期であることがわかります-最初のリクエストを行う前に完了する場合もあれば、完了しない場合もあります。後者の場合、まだアクティブな値を送信します:最初のインストールからのもの、まだ永続ストレージで。

(私はまだ Android 開発を学んでおり、いくつかの仮定が間違っている可能性があることに注意してください。Cookie の管理方法や、アクティビティのライフサイクルのある状態で行われた非同期呼び出しが、別の状態が実行されたときにまだ未完了であるかどうかについて) ;しかし、この解釈は、あなたが説明している動作とかなり一致しています)

于 2012-12-22T09:36:39.433 に答える
1

CookieManager.getInstance().removeAllCookie() 呼び出しの直後に CookieSyncManager.getInstance().sync() を呼び出してください。

その理由は@mgibsonbrで述べられているように、別のスレッドがタイマーによって駆動される間にCookieを保存するため、CookieSyncManager.getInstance().sync()を明示的に呼び出して永続化します。

于 2013-06-05T14:30:43.780 に答える
0

以下のコードを試してください:

BasicHttpContext mHttpContext;

CookieStore mCookieStore;
String persistentcookie;
CookieManager cookieManager;
CookieSyncManager syncManager;
private MultipartEntity m_hsmpeMultipartReqEntity;

  //manages the session of the webview for the image uploading on the server.
syncManager = CookieSyncManager.createInstance(m_hswvWebView.getContext());
syncManager.startSync();
cookieManager = CookieManager.getInstance();
boolean cok=cookieManager.acceptCookie(); // Here your cookie
persistentcookie=cookieManager.getCookie("http://www.xxxx.com/");       
String[] splitstr=pat.split(persistentcookie.toString());
String key=splitstr[0]; // Key of the Cookie
String value=splitstr[1]; //Session id
 m_hshttpClient = new DefaultHttpClient();
 mHttpContext  = new BasicHttpContext();
 mCookieStore = m_hshttpClient.getCookieStore();        

 BasicClientCookie clientcookie=new BasicClientCookie(key,value);
 clientcookie.setDomain(“www.xxxx.com”); // set the proper Domain URL
 mCookieStore.addCookie(clientcookie);             
 m_hshttppostRequest = new HttpPost(“http://www.xxxx.com/");
 // post URL after setting               cookie value.

 //set the cookie attribute in the BasicHTTPContext.

mHttpContext.setAttribute(ClientContext.COOKIE_STORE, mCookieStore);
m_hsmpeMultipartReqEntity = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE);

m_hshttppostRequest.setEntity (m_hsmpeMultipartReqEntity);
m_hshttpResponse = m_hshttpClient.execute(m_hshttppostRequest,mHttpContext);
于 2012-12-22T09:28:13.120 に答える