使用JavaFX的WebEngine / WebView设置cookie

时间:2013-01-17 17:59:00

标签: cookies http-headers javafx-2 javafx httprequest

我似乎找不到任何方法在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:(

我做错了什么?

2 个答案:

答案 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。它们可能会导致很多问题   网站因为他们实施了错误的标准。

我在此之后尝试使用谷歌搜索,但它似乎并不常见。如果有人能够提供更多细节,我将不胜感激。这看起来很奇怪,因为很多软件都使用了CookieStoreCookieManager

答案 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);
}
相关问题