42 votes

Définition d'un cookie à l'aide de WebEngine / WebView de JavaFX

Je n'arrive pas à trouver quelque sorte de définir un cookie par programmation à l'aide de WebEngine / WebView dans JavaFX. L'API ne donne aucune idée de la façon d'obtenir un HttpRequest-comme l'objet de modifier les en-têtes (qui est ce que j'utilise dans l'application de XML-RPC), ou toute sorte de gestionnaire de cookies.

Pas de questions sur cette page, semblent toucher sur la question soit - il est présent mais il désactive les cookies lorsque dans l'applet pour corriger un bug, mon application est sur le bureau btw.

La seule façon que j'image que je pouvais faire c'est en demandant la première page (qui nécessite un cookie avec un id de session pour charger correctement), l'obtention d'un "accès refusé"de style de message, de l'exécution du javascript dans le contexte de la page qui définit le cookie et l'actualisation. Cette solution serait une horrible expérience utilisateur bien.

Comment puis-je définir un cookie à l'aide de WebEngine?


Mise à jour: Prendre un indice à partir d'une question liée ci-dessus, j'ai essayé de creuser autour pour quelques exemples d'utilisation de CookieManager et des interfaces Api. J'ai trouvé ce code, que j'ai ensuite essayé de l'intégrer dans mon application, avec des résultats bizarres;

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

Maintenant, disons-nous faire ceci:

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

Débogage dans Eclipse après cette demande a été faite montre que la banque de cookies carte est titulaire d'un 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]}

C'EST GÉNIAL

WebEngine utilise simplement le sous-jacent enregistré cookie moteur! Mais attendez, est-il vraiment? Que diriez-vous de l'ajout d'un cookie, avant de faire la demande...

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

Ensuite, je regarde à la demande dans 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

Pas de cookie pour moi :(

Ce que je fais mal?

45voto

Dreen Points 1754

J'ai réussi à résoudre ce problème avec l'aide de Vasiliy Baranov à partir d'Oracle. Vasiliy m'a écrit:

Essayez de mettre le témoin en java.net.CookieHandler.getDefault()après la WebView est instancié pour la première fois et avant l'appel à WebEngine.load, par exemple comme suit:

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

Cela permettra de placer le biscuit dans le magasin de manière permanente, il doit être envoyé à chaque demande ultérieure, (sans doute à condition que le serveur n'a pas unset il).

Vasiliy a également expliqué qu' WebView installera sa propre implémentation de l' CookieHandler, tout en conservant les cookies mis en défaut.

Enfin, il mentionne quelque chose de tout à fait fascinant:

Ne perdez pas votre temps à essayer de les utiliser java.net.CookieManager, et java.net.CookieStore. Ils sont susceptibles de causer des problèmes avec de nombreux les sites parce qu'ils mettent en œuvre le mauvais standard.

J'ai essayé de googler après cela, mais il ne semble pas être de connaissance commune. Si quelqu'un est en mesure de fournir plus de détails, je vous serais reconnaissant. Il semble bizarre, car il paraît CookieStore et CookieManager sont utilisés par beaucoup de logiciels là-bas.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X