使用JavaFX的WebEngine / WebView设置cookie

我似乎无法find任何方式在JavaFX中使用WebEngine / WebView以编程方式设置cookie。 API并没有给出任何有关如何获得类似HttpRequest的对象来修改头文件(这是我在应用程序中使用的XML-RPC)或任何types的Cookiepipe理器。

这个页面上没有任何问题似乎涉及到这个问题 – 有这个,但它只是禁用cookies时,在小程序来修复一个错误 ,我的应用程序在桌面上顺便说一句。

唯一的办法,我形象我可以这样做是通过请求第一页(这需要一个会话ID加载正确的cookie),获得“访问被拒绝”式的消息,执行一些JavaScript的页面上下文中设置cookie和然后清爽。 但是这个解决scheme将会是一个糟糕的用户体验。

如何使用WebEngine设置cookie?


更新:从上面链接的问题,我试着挖掘一些使用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中进行debugging显示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为我:(

我究竟做错了什么?

我已经在Oracle的Vasiliy Baranov的帮助下设法解决了这个问题。 瓦西里写信给我:

第一次实例化WebView之后,在调用WebEngine.load之前,尝试将cookie放入java.net.CookieHandler.getDefault() ,例如:

 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放入商店永久,它应该被发送出去的每一个后续请求(大概提供的服务器不会取消)。

Vasiliy还解释说, WebView将安装自己的CookieHandler实现,同时保留Cookie放入默认的Cookie。

最后,他提到了一件非常有趣的事情:

不要浪费你的时间试图使用java.net.CookieManagerjava.net.CookieStore 。 他们很可能会导致许多网站的问题,因为他们执行错误的标准。

我之后尝试了Googlesearch,但似乎并不常见。 如果有人能够提供更多的细节,我将不胜感激。 这似乎很奇怪,因为看起来CookieStoreCookieManager被很多软件所使用。