Вручную установить куки в cookies store по умолчанию и использовать его в запросах охтп

В моем приложении для Android я перехожу на okhttp и мне нужно вручную настроить PHPSESSID для вошедших в систему пользователей в cookieStore по умолчанию, чтобы они не выходили из системы. Я вручную устанавливаю куки, используя следующий код.

((CookieManager)client.getCookieHandler()).getCookieStore().add(new URI("http://www.example.com"), new HttpCookie("PHPSESSID", getPhpSessionID()));

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

((CookieManager)client.getCookieHandler()).getCookieStore().get(new URI("http://www.example.com"));

Тем не менее, когда я выполняю вызов клиента с помощью

Request request = new Request.Builder().url("http://www.example.com/getdata.php").build(); 
client.newCall(request).execute();

Файлы cookie не отправляются в запросе (проверено это сетевое обращение с помощью прокси-сервера Android).

Как правильно установить такой файл cookie, чтобы клиент okhttp использовал этот файл cookie?

1 ответ

Решение

Кажется, есть разница между CookieHandler"s put реализация CookieManager и CookieStore"s add метод.

По умолчанию, если вы используете put от CookieManager это добавит домен и путь к HttpCookie созданный внутри реализации. Этого не произойдет, если вы используете CookieStoreдобавить метод напрямую, так как вы несете ответственность за создание HttpCookie,

Как выясняется OkHttp использует get от реализации, которая в вашем случае будет CookieManager а не CookieStore непосредственно. Тот get также будет использовать path соответствовать cookie, который в вашем случае будет отсутствовать.

Если вы не указали ожидаемый путь по умолчанию "/" к вашему HttpCookie Ваш файл cookie не будет найден.

Затем вы должны изменить свой HttpCookie вот так

HttpCookie cookie = new HttpCookie("PHPSESSID", getPhpSessionID());
cookie.setPath("/");
cookie.setVersion(0);
cookie.setDomain("www.example.com");
((CookieManager)client.getCookieHandler()).getCookieStore().add(new URI("http://www.example.com"), cookie);

Или чтобы ваше решение было более адаптируемым в случае изменения CookieHandler Реализация вы можете использовать интерфейс только вместо того, чтобы получить доступ к CookieStore

Вы бы сделали это так

List<String> values = new ArrayList<>(Arrays.asList("PHPSESSID=" + "your_session_id_here"));
Map<String, List<String>> cookies = new HashMap<>();
cookies.put("Set-Cookie", values);
client.getCookieHandler().put(new URI("http://www.example.com"), cookies);
Другие вопросы по тегам