it-swarm.com.ru

Установка файла cookie с использованием JavaFX WebEngine/WebView

Я не могу найти какой-либо способ установить cookie программно с помощью WebEngine / WebView в JavaFX. API не дает никакого представления о том, как получить HttpRequest-подобный объект для изменения заголовков (который я использую в приложении для XML-RPC), или какой-либо менеджер файлов cookie.

Никакие вопросы на этой странице, кажется, также не касаются этой проблемы - есть это , но он просто отключает куки, когда в апплете исправляется ошибка , мое приложение находится на рабочем столе, кстати.

Единственный способ, которым я могу представить это, - это запросить первую страницу (для корректной загрузки которой требуется файл cookie с sessionID), получить сообщение в стиле «отказано в доступе», выполнить некоторый javascript в контексте страницы, который устанавливает cookie и потом освежаю. Это решение было бы ужасным для пользователя.

Как мне установить cookie с помощью WebEngine?


Update: Понимая вопрос из вышеупомянутого вопроса, я попытался найти некоторые примеры использования CookieManager и связанных API. Я нашел этот код , который затем попытался включить в свое приложение, со странными результатами;

MyCookieStore cookie_store = new MyCookieStore();
CookieManager cookie_manager = new CookieManager(cookie_store, new MyCookiePolicy());
CookieHandler.setDefault(cookie_manager);
WebView wv = new WebView();

Теперь давайте скажем, что мы делаем это:

String url = "http://www.google.com/";
wv.getEngine.go(url);

Отладка в Eclipse после выполнения этого запроса показывает, что карта хранилища cookie содержит cookie:

{http://www.google.com/=[NID=67=XWOQNK5VeRGEIEovNQhKsQZ5-laDaFXkzHci_uEI_UrFFkq_1d6kC-4Xg7SLSB8ZZVDjTUqJC_ot8vaVfX4ZllJ2SHEYaPnXmbq8NZVotgoQ372eU8NCIa_7X7uGl8GS, PREF=ID=6505d5000db18c8c:FF=0:TM=1358526181:LM=1358526181:S=Nzb5yzBzXiKPLk48]}

ЭТО IS УДИВИТЕЛЬНЫЙ

WebEngine просто использует базовый зарегистрированный движок cookie! Но подождите, это правда? Давайте попробуем добавить куки, прежде чем сделать запрос ...

cookie_store.add(new URL(url).toURI(), new HttpCookie("testCookieKey", "testCookieValue"));

Тогда я смотрю на запрос в Wireshark ...

GET / HTTP/1.1
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/535.14 (KHTML, like Gecko) JavaFX/2.2 Safari/535.14
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Cache-Control: no-cache
Pragma: no-cache
Host: www.google.com
Connection: keep-alive

Нет печенья для меня :(

Что я делаю неправильно?

42
Dreen

Мне удалось решить эту проблему с помощью Василия Баранова из Oracle. Василий написал мне:

Попробуйте поместить куки в Java.net.CookieHandler.getDefault() после WebView создается в первый раз и перед вызовом WebEngine.load, например следующее:

WebView webView = new WebView();
URI uri = URI.create("http://mysite.com");
Map<String, List<String>> headers = new LinkedHashMap<String, List<String>>();
headers.put("Set-Cookie", Arrays.asList("name=value"));
Java.net.CookieHandler.getDefault().put(uri, headers);
webView.getEngine().load("http://mysite.com");

Это сохранит cookie в хранилище на постоянной основе, его следует отправлять при каждом последующем запросе (предположительно, при условии, что сервер не отменяет его).

Василий также пояснил, что WebView установит свою собственную реализацию CookieHandler, сохранив при этом куки-файлы, установленные по умолчанию.

Наконец, он упоминает нечто весьма интригующее:

Не тратьте свое время на попытки использовать Java.net.CookieManager и Java.net.CookieStore. Они могут вызвать проблемы со многими сайты, потому что они реализуют неправильный стандарт.

После этого я попробовал поискать в Google, но это не является общеизвестным. Если кто-то может предоставить более подробную информацию, я был бы признателен. Это кажется странным, поскольку кажется, что CookieStore и CookieManager используются многими программами.

45
Dreen

Решение для Java.net.CookieManager

Сериализация файлов cookie:

        List<HttpCookie> httpCookies = cookieManager.getCookieStore().getCookies();
        Gson gson = new GsonBuilder().create();
        String jsonCookie = gson.toJson(httpCookies);

Десериализация файлов cookie:

Gson gson = new GsonBuilder().create();
List<HttpCookie> httpCookies = new ArrayList<>();
Type type = new TypeToken<List<HttpCookie>>() {}.getType();
httpCookies = gson.fromJson(json, type);   // convert json string to list
for (HttpCookie cookie : httpCookies) {
    cookieManager.getCookieStore().add(URI.create(cookie.getDomain()), cookie);
}
0
Vladimir