Вручную установить куки в 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);