43

JavaFXでWebEngine / WebViewを使用してプログラムでCookieを設定する方法が見つからないようです。APIは、ヘッダー(XML-RPCのアプリで使用するもの)を変更するためにHttpRequestのようなオブジェクトを取得する方法や、あらゆる種類のCookieマネージャーについては何も示していません。

このページの質問もこの問題に触れていないようです-これはありますが、アプレットでバグを修正するときにCookieを無効にするだけで、私のアプリはデスクトップにあります。

私がそれを行うことができる唯一の方法は、最初のページを要求し(適切にロードするには、sessionIDを持つCookieが必要です)、「アクセス拒否」スタイルのメッセージを取得し、Cookieを設定するページコンテキストでJavaScriptを実行することです。その後、さわやか。ただし、このソリューションは恐ろしいユーザーエクスペリエンスになります。

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

今、これを行うとしましょう:

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

私にはクッキーはありません:(

私は何が間違っているのですか?

4

2 に答える 2

48

OracleのVasiliyBaranovの助けを借りて、この問題を解決することができました。Vasiliyは私に次のように書いています。

java.net.CookieHandler.getDefault()WebViewが初めてインスタンス化された後、への呼び出しの前に WebEngine.load、たとえば次のようにCookieを挿入してみてください。

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

これにより、Cookieが永続的にストアに配置され、後続のすべてのリクエストで送信される必要があります(おそらく、サーバーがCookieの設定を解除しない場合)。

Vasiliyはまた、デフォルトのCookieに入れられたCookieを保持しながら、WebView独自の実装をインストールすることを説明しました。CookieHandler

最後に、彼は非常に興味深いことに言及しています。

java.net.CookieManager、、 を使用しようとして時間を無駄にしないでくださいjava.net.CookieStore。それらは間違った標準を実装しているため、多くのサイトで問題を引き起こす可能性があります。

この後グーグルしてみましたが、常識ではないようです。誰かがより多くの詳細を提供することができれば私は感謝するでしょう。それはそこにある多くのソフトウェアによって使用されてCookieStoreいるように見えるので、それは奇妙に思えます。CookieManager

于 2013-01-25T10:25:37.657 に答える
2

java.net.CookieManagerのソリューション

クッキーのシリアル化:

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

Cookieの逆シリアル化:

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);
}
于 2018-06-06T10:51:32.367 に答える