Что это означает для управления файлами 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,

Мои интерпретации:

  1. Один способ, которым я интерпретировал это, создает 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, Таким образом, я полагаю, что эта интерпретация общедоступной виртуальной машины неверна.

  2. Вторая интерпретация была 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 между сеансами, хотя это должно быть редко полезно (только мое мнение)