Configurer un cookie en utilisant le WebEngine/WebView de JavaFX

il semble que je ne puisse trouver aucun moyen de configurer un cookie de façon programmatique en utilisant WebEngine / WebView dans JavaFX. L'API ne donne aucune idée de la façon d'obtenir un objet de type HttpRequest pour modifier les en-têtes (ce qui est ce que j'utilise dans l'application pour XML-RPC), ou n'importe quelle sorte de gestionnaire de cookies.

Aucune Question sur cette page ne semble toucher à la question non plus - il est ce mais il ne cookies lorsque dans applet pour corriger un bug , mon application est sur le bureau btw.

la seule façon dont je peux le faire est de demander la première page (qui nécessite un cookie avec un sessionID pour charger correctement), d'obtenir un message de style"access denied", d'exécuter du javascript dans le contexte de la page qui définit le cookie, puis de rafraîchir. Cette solution serait une expérience utilisateur horrible.

comment configurer un cookie en utilisant WebEngine?


mise à jour: en prenant un indice d'une question liée ci-dessus, j'ai essayé de creuser autour de quelques exemples d'utilisation de CookieManager et APIs connexes. j'ai trouvé ce code , que j'ai ensuite essayé d'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();

disons maintenant que nous faisons ceci:

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

débogage Eclipse après que cette demande a été faite montre que la carte de magasin de cookie détient 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]}

THAT IS AWESOME

WebEngine utilise simplement le moteur de cookie enregistré sous-jacent! Mais attends, c'est vraiment? Essayons d'ajouter un cookie, avant de faire la requête...

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

puis 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?

42
demandé sur Community 2013-01-17 21:59:00

2 réponses

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

essayez de mettre le cookie dans java.net.CookieHandler.getDefault() après la WebView est instancié pour la première fois et avant l'appel à WebEngine.load , p.ex. 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 placera le cookie dans le magasin de façon permanente, il doit être envoyé à chaque demande ultérieure (probablement fourni que le serveur ne le désactive pas).

Vasiliy a également expliqué que WebView installera son propre implémentation de la CookieHandler , tout en conservant les cookies mis dans celui par défaut.

enfin, il mentionne quelque chose de très intrigant:

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

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. Cela semble étrange, car il semble CookieStore et CookieManager sont utilisés par beaucoup de logiciels là-bas.

45
répondu Dreen 2013-01-25 17:07:46

Solution pour java.net.CookieManager

Témoins de la sérialisation:

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

désérialisation des 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
répondu Vladimir 2018-06-06 10:51:32