Настройка 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 для меня: (
Что я делаю неправильно?
Ответы
Ответ 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
используются большим количеством программного обеспечения там.