Intereting Posts
Как указать значки в manifest.json? Проблемы с OAuth2 после обновления firebase Обеспечение безопасности веб-службы, поэтому ее можно вызывать только с помощью специального приложения для Android Не удалось создать внешнюю библиотеку OpenSSL для Android NDK для Windows / Cygwin Определите, открывается или закрывается NavigationDrawer Где вы загружаете ошибки для продуктов и сервисов Google Android / iOS (AppInvites, Maps и т. Д.)? Всегда показывать полосу прокрутки для ListView ShareActionProvider с одним значком – выглядит как простой actionitem Как использовать managedQuery в сервисе Android? События неравномерного каротажа не всегда Добавление готового двоичного файла в Android-источник Как изменить размер текста в зависимости от размера виджета в текстовом виде в приложении? Android: всплывающее окно с ошибкой в ​​EditText не сдвигается вниз, когда клавиатура уходит Легкий способ определить, где нить ui застопорилась на Android? Откройте внешние ссылки в браузере с веб-браузером Android

. CookieManager.getInstance () removeAllCookie (); Не удаляет все файлы cookie

Я вызываю CookieManager.getInstance (). RemoveAllCookie () в onCreate в моем приложении.

У меня запуталась странная проблема, когда я вижу неожиданное значение cookie, которое передается в запросе GET. Фактически, значение cookie – действительно, действительно старое значение.

Вот шаги, которые я выполняю для теста:

  1. Установка приложения
  2. Сделайте запрос GET при запуске приложения. Запрос должен быть чистым: никакие файлы cookie не должны быть отправлены.
  3. Запрос GET отвечает Set-Cookie. Значение основано на времени запроса, поэтому есть очень мало шансов, что это значение одинаково для любых двух запросов.
  4. Сделайте еще один запрос GET. Запрос должен отправить значение cookie с шага 3.

В первый раз, когда я установил приложение, поведение cookie работало так, как я ожидал выше. Я удалил приложение, а затем снова установил его, и поведение cookie снова работало, как ожидалось. Я делаю это несколько раз, все в порядке и денди.

Затем, внезапно, на установке Nth, шаг 2 не проходит. Самый первый запрос GET не чист. Фактически, он поставляется со значением, которое было установлено при первой установке приложения.

Я не могу достоверно воспроизвести эту проблему, но я ее довольно часто вижу. Дело не в том, что первый запрос GET при установке отправляет значение cookie из непосредственно предыдущей установки – значение составляет от трех или четырех предыдущих установок, за которыми следуют uninstalls .

Как возможно, что я это вижу? Как я могу удалить все файлы cookie приложения?

Solutions Collecting From Web of ". CookieManager.getInstance () removeAllCookie (); Не удаляет все файлы cookie"

Это выстрел в темноте, но, возможно, файлы cookie с вашей первой установки находятся в постоянном хранилище, в то время как файлы из резервных копий кэшируются в ОЗУ. Возможно, действие удаления всех файлов cookie по какой-то причине не синхронизируется с постоянным хранилищем, поэтому оно сохраняет старые значения между реинсталляторами.

Цитирование документов для CookieSyncManager (основное внимание):

CookieSyncManager используется для синхронизации хранилища файлов cookie браузера между ОЗУ и постоянным хранилищем. Чтобы получить максимальную производительность, куки-файлы браузера сохраняются в ОЗУ. Отдельный поток сохраняет файлы cookie между ними, управляемыми таймером .

Интервал синхронизации составляет 5 минут, поэтому вам потребуется принудительно синхронизировать вручную, например, в onPageFinished (WebView, String). Обратите внимание, что даже sync () происходит асинхронно , поэтому не делайте этого так же, как ваша активность отключается .

Это сильно говорит о том, что, возможно, (по вашим тестам, которые, как я полагаю, иногда делалось с интервалом менее 5 минут), когда приложение было удалено, оно еще не синхронизировалось, поэтому старые значения с первой установки все еще находились в Постоянное хранение на этом этапе. У меня также нет оснований предполагать, что синхронизация произошла во время удаления, если бы 5-минутный интервал не прошел.

Это оставляет один вопрос: почему иногда некоторые файлы cookie отправляются, хотя вы очистили их в onCreate ? Оказывается, removeAllCookie также асинхронен – иногда он будет завершен до того, как вы сделаете свой первый запрос, иногда он не будет, и в последнем случае он будет отправлять значения, которые все еще активны: те, которые были с вашей первой установки, которые Все еще в постоянном хранилище.

(Обратите внимание, что я все еще изучаю разработку Android, и некоторые из моих предположений могут быть неправильными – о том, как управляются файлы cookie, и о том, будет ли асинхронный вызов, сделанный в одном состоянии в жизненном цикле активности, еще не завершенным, когда другой запускается , Но эта интерпретация вполне соответствует описанию поведения)

Пожалуйста, вызовите CookieSyncManager.getInstance (). Sync () сразу после вызова CookieManager.getInstance (). RemoveAllCookie ().

Причина такова, как упоминалось в @mgibsonbr, отдельный поток сохраняет куки между ними, управляемый таймером, поэтому, чтобы сделать его постоянным, немедленно вызовите CookieSyncManager.getInstance (). Sync () явно.

Попробуйте ниже код:

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); 
 if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) { CookieManager.getInstance().removeAllCookies(null); } else { CookieSyncManager.createInstance(context); CookieManager cookieManager = CookieManager.getInstance(); if (cookieManager != null) { cookieManager.removeAllCookie(); } CookieSyncManager.getInstance().sync(); }