Cookies 使用JavaFX'设置cookie;s WebEngine/WebView

Cookies 使用JavaFX'设置cookie;s WebEngine/WebView,cookies,http-headers,javafx-2,javafx,httprequest,Cookies,Http Headers,Javafx 2,Javafx,Httprequest,我似乎找不到任何方法使用/在JavaFX中以编程方式设置cookie。API没有给出任何关于如何获得类似HttpRequest的对象来修改头(这是我在XML-RPC应用程序中使用的)或任何类型的cookie管理器的想法 在这个页面上似乎没有任何问题涉及到这个问题-有,但它只是禁用cookies时,在小程序修复,我的应用程序是在桌面上顺便说一句 我能做到这一点的唯一方法是请求第一个页面(需要正确加载带有sessionID的cookie),获取“拒绝访问”样式的消息,在页面上下文中执行一些javas

我似乎找不到任何方法使用/在JavaFX中以编程方式设置cookie。API没有给出任何关于如何获得类似HttpRequest的对象来修改头(这是我在XML-RPC应用程序中使用的)或任何类型的cookie管理器的想法

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

我能做到这一点的唯一方法是请求第一个页面(需要正确加载带有sessionID的cookie),获取“拒绝访问”样式的消息,在页面上下文中执行一些javascript设置cookie,然后刷新。不过,这种解决方案将是一种可怕的用户体验

如何使用WebEngine设置cookie


更新:从上面链接的一个问题中获取线索,我尝试挖掘一些使用和相关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
我没有饼干:(


我做错了什么?

在Oracle的瓦西里·巴拉诺夫的帮助下,我成功地解决了这个问题。瓦西里写信给我:

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

WebView-WebView=new-WebView();
URI=URI.create(“http://mysite.com");
映射头=新建LinkedHashMap();
headers.put(“Set Cookie”,Arrays.asList(“name=value”);
java.net.CookieHandler.getDefault().put(uri,头);
webView.getEngine().load(“http://mysite.com");
这将把cookie永久地放在存储中,它应该在每次后续请求时发送出去(假设服务器没有取消设置)

瓦西里还解释说,
WebView
将安装自己的
CookieHandler
实现,同时保留默认的cookie

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

不要浪费时间尝试使用
java.net.CookieManager
,以及
java.net.CookieStore
。它们可能会给许多用户带来问题 因为他们实施了错误的标准


我试过用谷歌搜索,但这似乎不是常识。如果有人能提供更多细节,我将不胜感激。这似乎很奇怪,因为很多软件都在使用
CookieStore
CookieManager

java.net.CookieManager的解决方案

Cookies序列化:

        List<HttpCookie> httpCookies = cookieManager.getCookieStore().getCookies();
        Gson gson = new GsonBuilder().create();
        String jsonCookie = gson.toJson(httpCookies);
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);
}
List httpCookies=cookieManager.getCookieStore().getCookies();
Gson Gson=new GsonBuilder().create();
字符串jsonCookie=gson.toJson(httpCookies);
Cookies反序列化:

        List<HttpCookie> httpCookies = cookieManager.getCookieStore().getCookies();
        Gson gson = new GsonBuilder().create();
        String jsonCookie = gson.toJson(httpCookies);
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);
}
Gson Gson=new GsonBuilder().create();
List httpCookies=new ArrayList();
Type Type=new-TypeToken(){}.getType();
httpCookies=gson.fromJson(json,type);//将json字符串转换为列表
用于(HttpCookie cookie:httpCookies){
cookieManager.getCookieStore().add(URI.create(cookie.getDomain()),cookie);
}

当我使用这段代码时,我得到下面的异常groovy.lang.MissingMethodException:没有方法签名:java.net.CookieManager.put()适用于参数类型:(java.lang.String,java.util.LinkedHashMap)为我工作非常感谢!基本上,当程序退出时,我使用
cookieManager.getCookieStore().getCookies()
,将它们保存在文件中,并在启动时使用您的代码来设置它们。@MinasMina当我运行
cookieManager.getCookieStore().getCookies()时
我得到了一个空白列表。这是过去几天我唯一能找到的解决方案。这是一个非常简单的解决方案,我忽略了它太久。我唯一没有处理的问题是,这会导致一些“com.google.gson.internal.reflect.unasserectionaccessor非法反射访问”的警告.不过我正在努力学习Java 12,所以我知道它特别挑剔。