it-swarm.com.de

Setzen eines Cookies mit JavaFX's WebEngine/WebView

Ich kann scheinbar keine Möglichkeit finden, ein Cookie programmatisch mit WebEngineWebView in JavaFX zu setzen. Die API lässt keine Ahnung zu, wie ein HttpRequest-ähnliches Objekt zum Ändern der Kopfzeilen (was ich in der App für XML-RPC verwende) oder eine Art von Cookie-Manager abgerufen wird.

Keine Fragen auf dieser Seite scheinen das Problem zu berühren - es gibt this , aber es deaktiviert nur Cookies, wenn sich im Applet ein Fehler befindet, meine App ist übrigens auf dem Desktop.

Die einzige Möglichkeit, ein Image zu erstellen, besteht darin, die erste Seite anzufordern (dazu ist ein Cookie mit einer Sitzungs-ID erforderlich, um ordnungsgemäß geladen zu werden), eine "Zugriff verweigert" -Stilnachricht erhalten und Javascript im Seitenkontext ausgeführt, der das Cookie setzt dann erfrischend. Diese Lösung wäre jedoch eine schreckliche Benutzererfahrung.

Wie kann ich mit WebEngine einen Cookie setzen?


_/Update: Ich nahm einen Hinweis auf eine Frage, die oben verlinkt wurde, und versuchte, einige Beispiele für die Verwendung von CookieManager und verwandten APIs zu finden. Ich habe diesen Code gefunden , das ich dann mit merkwürdigen Ergebnissen in meine App integrieren wollte;

MyCookieStore cookie_store = new MyCookieStore();
CookieManager cookie_manager = new CookieManager(cookie_store, new MyCookiePolicy());
CookieHandler.setDefault(cookie_manager);
WebView wv = new WebView();

Nun sagen wir, wir machen das:

String url = "http://www.google.com/";
wv.getEngine.go(url);

Das Debuggen in Eclipse nach dieser Anfrage zeigt, dass die Cookie-Store-Karte ein Cookie enthält:

{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]}

DIESES IS EHRFÜRCHTIG

WebEngine verwendet einfach die zugrunde liegende registrierte Cookie-Engine! Aber warten Sie, ist es wirklich so? Lass uns versuchen, vor der Anfrage einen Cookie hinzuzufügen ...

cookie_store.add(new URL(url).toURI(), new HttpCookie("testCookieKey", "testCookieValue"));

Dann schaue ich mir die Anfrage in Wireshark an ...

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

Kein Cookie für mich :(

Was mache ich falsch?

42
Dreen

Es ist mir gelungen, dieses Problem mit Hilfe von Vasiliy Baranov von Oracle zu lösen. Vasiliy schrieb mir:

Versuchen Sie, den Cookie nach .__ in Java.net.CookieHandler.getDefault() zu platzieren. Die WebView wird zum ersten Mal und vor dem Aufruf von .__ instanziiert. WebEngine.load, z.B. wie folgt:

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");

Dadurch wird das Cookie dauerhaft im Speicher abgelegt. Es sollte bei jeder nachfolgenden Anforderung gesendet werden (vorausgesetzt, der Server löscht es nicht).

Vasiliy erklärte auch, dass WebView seine eigene Implementierung der CookieHandler installieren wird, während Cookies in der Standardeinstellung bleiben.

Zum Schluss erwähnt er etwas sehr Interessantes:

Verschwenden Sie nicht Ihre Zeit damit, Java.net.CookieManager und .__ zu verwenden. Java.net.CookieStore. Sie verursachen wahrscheinlich Probleme mit vielen Websites, weil sie den falschen Standard implementieren.

Ich habe versucht, danach zu googeln, aber es scheint nicht allgemein bekannt zu sein. Wenn jemand mehr Details angeben kann, wäre ich dankbar. Es scheint seltsam zu sein, da es scheint, dass CookieStore und CookieManager von einer Menge Software draußen verwendet werden.

45
Dreen

Lösung für Java.net.CookieManager

Cookies-Serialisierung:

        List<HttpCookie> httpCookies = cookieManager.getCookieStore().getCookies();
        Gson gson = new GsonBuilder().create();
        String jsonCookie = gson.toJson(httpCookies);

Deserialisierung von 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);
}
0
Vladimir