Что это означает для управления файлами cookie для всей VM?
Я учусь хранить cookies
в Android и наткнулся на несколько способов его реализации. Одним из них является использование CookieManager and CookieStore
,
Когда я просматривал документы по Android, я натолкнулся на следующее утверждение:
Чтобы установить и поддерживать потенциально долгоживущий сеанс между клиентом и сервером, HttpURLConnection включает в себя расширяемый менеджер файлов cookie. Включите управление файлами cookie для всей VM с использованием CookieHandler и CookieManager:
CookieManager cookieManager = new CookieManager();
CookieHandler.setDefault(cookieManager);
Я не понимаю смысла VM-wide cookie management
, Я знаю, что VM означает Virtual Machine
,
Мои интерпретации:
Один способ, которым я интерпретировал это, создает
CookieManager
и передать егоsetDefault()
делает его доступным во всем приложении. Поэтому я попробовал следующее, чтобы проверить это.URL url = new URL("http://something.com"); URI uri=new URI("http://something.com"); urlConnection = (HttpURLConnection) url.openConnection(); cks=urlConnection.getHeaderField("Set-Cookie"); //cks is a String cookieManager=new CookieManager(); CookieHandler.setDefault(cookieManager); HttpCookie hc=new HttpCookie("Cookie1",cks); cookieManager.getCookieStore().add(uri,hc); cks1=cookieManager.getCookieStore().getCookies().get(0).getValue(); //cks1 is another String
Я поставил
cks and cks1
вTextViews
и это напечатано печеньеcontent/value
как и ожидалось. Исходя из моей интерпретации, я попыталсяcookieManager.getCookieStore().getCookies().get(0).getValue();
в другом действии, но он не распознал объект, что означает, что он находится вне области видимости и недоступен. Также создан новыйCookieManager
и попытался получить куки, но он вернулсяnull
, Таким образом, я полагаю, что эта интерпретация общедоступной виртуальной машины неверна.Вторая интерпретация была Cookies будут автоматически сохраняться, когда
CookieManager
настроен. Я получил это от решения другого вопроса о SO: Управление cookie с помощью Java URLConnection
Одно из утверждений в решении, которое предлагает так:
Когда HttpURLConnection получает файл cookie от сервера, CookieManager получает файл cookie и сохраняет его. Будущие запросы на тот же сервер будут автоматически отправлять ранее установленные куки.
Я удалил cookieManager.getCookieStore().add(uri,hc);
чтобы проверить это и обнаружил, что куки не сохраняются автоматически. Таким образом, эта интерпретация тоже не работает.
ДРУГОЕ СОМНЕНИЕ, КОТОРОЕ МЕНЯ ПРЕДСТАВЛЯЕТ
Большинство решений для хранения файлов cookie для последующего использования предполагает использование SharedPreferences
, Меня преследует то, что все они хранят печенье в CookieManager
вначале и позже перемещает его в SharedPreferences
, Почему бы не использовать SharedPreferences
напрямую?
Например:
URL url = new URL("http://something.com");
urlConnection = (HttpURLConnection) url.openConnection();
cks=urlConnection.getHeaderField("Set-Cookie");
SharedPreferences pref = getApplicationContext().getSharedPreferences("MyPref", MODE_PRIVATE);
Editor editor = pref.edit();
editor.putString("cookie_name", cks); // Saving cookie
editor.commit();
Так какой смысл использовать CookieManager
а затем переместить его в SharedPreferences
?
1 ответ
Более подробную информацию о платформе управления файлами cookie Android можно найти в этом документе, но вкратце, вам нужно только setDefault()
один раз. В последующих звонках вы можете использовать CookieHandler.getDefault()
и вы предоставляете куки для сессий, как показано в этом ответе
Используя реализации по умолчанию, вы сможете получить доступ к файлам cookie только из своего приложения.
Проще говоря, виртуальная машина Android - это слой, который преобразует байт-код вашего приложения в машинный код, и это одна виртуальная машина на приложение, поэтому VM-Wide означает область приложения.
SharedPrefs можно использовать для сохранения файлов cookie между сеансами, хотя это должно быть редко полезно (только мое мнение)