我似乎找不到任何方法来使用JavaFX 中的WebEngine / WebView以编程方式设置 cookie。API 没有提供关于如何获取类似 HttpRequest 的对象以修改标头(这是我在应用程序中用于 XML-RPC 的)或任何类型的 cookie 管理器的任何想法。
这个页面上的问题似乎也没有涉及到这个问题 - 有这个,但它只是在小程序中禁用 cookie 来修复错误,我的应用程序在桌面上。
我想我能做到的唯一方法是请求第一页(这需要一个带有 sessionID 的 cookie 才能正确加载),获取“拒绝访问”样式的消息,在设置 cookie 的页面上下文中执行一些 javascript 和然后令人耳目一新。不过,这种解决方案将是一种糟糕的用户体验。
如何使用 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 中进行调试显示 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
我没有饼干 :(
我究竟做错了什么?