Dre*_*een 42 cookies javafx httprequest http-headers javafx-2
我似乎找不到任何方法在JavaFX中使用WebEngine/WebView以编程方式设置cookie .API没有给出任何关于如何获得类似HttpRequest的对象来修改标题(这是我在XML-RPC中使用的应用程序)或任何类型的cookie管理器的想法.
这个页面上的任何问题似乎都没有触及这个问题 - 有这个,但它只是在applet中修复bug时禁用cookie ,我的应用程序在桌面上btw.
我想象的唯一方法是通过请求第一页(需要带有sessionID的cookie才能正确加载),获取"拒绝访问"风格的消息,在页面上下文中执行一些javascript来设置cookie和然后刷新.这个解决方案虽然是一个糟糕的用户体验.
如何使用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();
Run Code Online (Sandbox Code Playgroud)
现在让我们说这样做:
String url = "http://www.google.com/";
wv.getEngine.go(url);
Run Code Online (Sandbox Code Playgroud)
在发出此请求后在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]}
Run Code Online (Sandbox Code Playgroud)
WebEngine只使用底层注册的cookie引擎!但等等,真的吗?让我们在发出请求之前尝试添加cookie ...
cookie_store.add(new URL(url).toURI(), new HttpCookie("testCookieKey", "testCookieValue"));
Run Code Online (Sandbox Code Playgroud)
然后我看看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
Run Code Online (Sandbox Code Playgroud)
我没有饼干:(
我究竟做错了什么?
Dre*_*een 45
我已经在Oracle的Vasiliy Baranov的帮助下设法解决了这个问题.瓦西里写信给我:
java.net.CookieHandler.getDefault()在第一次实例化WebView之后和调用之前 尝试将cookie放入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");
Run Code Online (Sandbox Code Playgroud)
这会将cookie永久地放入商店,它应该在每个后续请求中发送出去(假设服务器没有取消设置).
Vasiliy还解释说,WebView将安装它自己的实现CookieHandler,同时保留默认的cookie.
最后,他提到了一些非常有趣的东西:
不要浪费你的时间尝试使用
java.net.CookieManager,和java.net.CookieStore.它们可能会导致许多站点出现问题,因为它们实现了错误的标准.
我在此之后尝试使用谷歌搜索,但它似乎并不常见.如果有人能够提供更多细节,我将不胜感激.这似乎很奇怪,因为它看起来很多CookieStore并且CookieManager被很多软件使用.
| 归档时间: |
|
| 查看次数: |
16875 次 |
| 最近记录: |