Подтвердить что ты не робот

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

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

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

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

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


Обновление: Взяв ключ из вопроса, связанного выше, я попытался найти некоторые примеры использования 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]}

ЭТО УДИВИТЕЛЬНО

WebEngine просто использует базовый зарегистрированный движок cookie! Но подождите, правда? Давайте попробуем добавить файл 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

Нет cookie для меня: (

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

4b9b3361

Ответ 1

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

Попробуйте поместить файл cookie в 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, сохраняя при этом файлы cookie в стандартном.

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

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

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