Cookies не поддаются пониманию

Ответить
Аватара пользователя
Mikhail_dev
Сообщения: 2386
Зарегистрирован: 09 янв 2012, 14:45
Откуда: Самара

Cookies не поддаются пониманию

Сообщение Mikhail_dev » 06 авг 2014, 12:19

Так как до сего дня не было нужды работать с кукисами (обычно токен в заголовках передавали), то возникли некоторые сложности. Есть код (не мой).

[syntax=java5]
public static LoginResult signIn(String simId, String login, String password, String gcmAppId, String gcmRegistrationId) throws ApiException {
if (simId == null && (login == null || password == null)) return null;

CookieManager cookieManager = new CookieManager();
CookieManager.setDefault(cookieManager);

LoginResult result = null;
HttpURLConnection urlConnection = null;
try {
urlConnection = openConnection(URL_LOGIN);
urlConnection.setRequestMethod("POST");
urlConnection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");

urlConnection.setDoOutput(true);

OutputStreamWriter writer = new OutputStreamWriter(urlConnection.getOutputStream());
String formString = "какая-то строка запроса";

writer.write(formString);
writer.flush();
writer.close();

int responseCode = urlConnection.getResponseCode();

if (HttpURLConnection.HTTP_OK == responseCode) {
InputStreamReader reader = new InputStreamReader(urlConnection.getInputStream());
result = AppSettings.getGson().fromJson(reader, LoginResult.class);
} else {
throw getException(responseCode);
}
} catch (IOException e) {
throw new ApiException(e, R.string.message_not_connected);

} finally {
if (urlConnection != null) urlConnection.disconnect();
}
return result;
}
[/syntax]

Кукисы сами по себе, это просто строковые данные, которые зачастую необходимы для авторизации. Так вот, в данном методе строки
[syntax=java5] CookieManager cookieManager = new CookieManager();
CookieManager.setDefault(cookieManager);[/syntax]
непонятно что делают. Они не используются в коде. Они не записывают кукисы в запрос и не считывают их с запроса.
Я не понимаю, каким образом работать с кукисами, где их считывать и записывать? Что это за магические две строки, которые хрен пойми что делают? Точнее понятно что делают, но не для меня.
Sessions with Cookies

To establish and maintain a potentially long-lived session between client and server, HttpURLConnection includes an extensible cookie manager. Enable VM-wide cookie management using CookieHandler and CookieManager:
CookieManager cookieManager = new CookieManager();
CookieHandler.setDefault(cookieManager);

By default, CookieManager accepts cookies from the origin server only. Two other policies are included: ACCEPT_ALL and ACCEPT_NONE. Implement CookiePolicy to define a custom policy.
The default CookieManager keeps all accepted cookies in memory. It will forget these cookies when the VM exits. Implement CookieStore to define a custom cookie store.
Как правильно работать с кукисами (применительно к HttpURLConnection)? Что делают эти две строки? Да и вообще, "CookieStore, Cookiehandler, CookieManager, CookieSyncManager" кто все эти 'люди'?

Аватара пользователя
altwin
Сообщения: 1951
Зарегистрирован: 13 ноя 2013, 14:46

Re: Cookies не поддаются пониманию

Сообщение altwin » 06 авг 2014, 12:42

[syntax=java5]CookieManager cookieManager = new CookieManager();
CookieManager.setDefault(cookieManager);[/syntax]
Ты создаешь объект дефолтного CookieManager, чтобы иметь к нему доступ и соответсвенно говоришь о том, что именно его нужно использовать. Суть в том, что дефолтный хранит все в памяти и соответсвенно уничтожает при смерти VM, иначе тебе нужно реализовать CookieStore, опять же тут можно добавить обработку кукисов из других доменов, по умолчанию такая возможность отключена. В общем суть в том, что тут с куками ты не работаешь, а определяешь способ их хранения.

С куками можно работать, как с простыми строками передавая их как простые Ключ/Значение объекты с запросом( http://stackoverflow.com/a/13429496 ), но проще использовать специальные классы, которые уже есть в android, для примера:
http://stackoverflow.com/a/12731212

P.S. в понимании классов, тебе поможет как это ни банально простой перевод:
CookieManager - менеджер по умолчанию
CookieStore - менеджер определяемый пользователем
Cookiehandler - тоже менеджер но позволяет работать с куками по http протоколу ( т.е. обработчик )
CookieSyncManager - синхронизация
Изображение


Аватара пользователя
Mikhail_dev
Сообщения: 2386
Зарегистрирован: 09 янв 2012, 14:45
Откуда: Самара

Re: Cookies не поддаются пониманию

Сообщение Mikhail_dev » 06 авг 2014, 16:45

Однако не могу так до конца реализовать. Допустим есть кука
ASP.NET_SessionIdTemp=jcxhu3kka23e4sfqpdf2zy1k; expires=Wed, 13-Aug-2014 12:42:53 GMT; path=/; HttpOnly
Пытаюсь её засунуть в CookieManager , который у меня инициализируется так
[syntax=java5]
private static CookieManager mCookieManager;
static {
mCookieManager = new CookieManager();
CookieManager.setDefault(mCookieManager);
}
[/syntax]
Я так понимаю, что ASP.NET_SessionIdTemp - это ключ, а jcxhu3kka23e4sfqpdf2zy1k - значение. Но как засунуть их в mCookieManager ? Мне нужно именно туда, ибо потом по логике все методы работы с куками по умолчанию должны будут брать оттуда значения.
Я не понимаю суть данного метода.
public void put (URI uri, Map<String, List<String>> responseHeaders)

Added in API level 9
Sets cookies according to uri and responseHeaders

Parameters
uri the specified uri
responseHeaders a list of request headers
Throws
IOException if some error of I/O operation occurs
URI понятно, это домен. Но что за мапа? Что является ключем и что списком значений? Ведь ключ не это - ASP.NET_SessionIdTemp ? Ибо в данной ситуации, значение должно быть одно.


Ответить