我似乎找不到任何方法在JavaFX中使用WebEngine / WebView以编程方式设置cookie。 API没有提供任何关于如何获取类似HttpRequest的对象来修改标头(我在应用程序中使用XML-RPC)或任何类型的cookie管理器的想法。
此页面上的任何问题似乎都没有触及此问题 - 有this但它只是在applet中修复bug时禁用Cookie,我的应用程序是在桌面上btw。
我想象的唯一方法是通过请求第一页(需要带有sessionID的cookie才能正确加载),获取“拒绝访问”风格的消息,在页面上下文中执行一些javascript设置cookie然后刷新。这个解决方案虽然会带来糟糕的用户体验。
如何使用WebEngine设置cookie?
更新:从上面链接的问题中找到线索,我尝试了解使用CookieManager和相关API的一些示例。 I found this code,然后我尝试将其合并到我的应用中,结果很奇怪;
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:(
我做错了什么?
答案 0 :(得分:45)
我已经在Oracle的Vasiliy Baranov的帮助下设法解决了这个问题。瓦西里写信给我:
尝试将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永久地放入商店,它应该在每个后续请求中发送出去(假设服务器没有取消设置)。
Vasiliy还解释说,WebView
将安装自己的CookieHandler
实施,同时保留默认的cookie。
最后,他提到了一些非常有趣的东西:
不要浪费时间尝试使用
java.net.CookieManager
,和java.net.CookieStore
。它们可能会导致很多问题 网站因为他们实施了错误的标准。
我在此之后尝试使用谷歌搜索,但它似乎并不常见。如果有人能够提供更多细节,我将不胜感激。这看起来很奇怪,因为很多软件都使用了CookieStore
和CookieManager
。
答案 1 :(得分:1)
java.net.CookieManager的解决方案
Cookie序列化:
List<HttpCookie> httpCookies = cookieManager.getCookieStore().getCookies();
Gson gson = new GsonBuilder().create();
String jsonCookie = gson.toJson(httpCookies);
Cookies反序列化:
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);
}