5

私の Android アプリケーションでは、okhttp に移行しており、ログインしているユーザーがログアウトしないように、デフォルトの cookieStore で PHPSESSID を手動で設定する必要があります。次のコードを使用して手動で Cookie を設定しています。

((CookieManager)client.getCookieHandler()).getCookieStore().add(new URI("http://www.example.com"), new HttpCookie("PHPSESSID", getPhpSessionID()));

このコードを使用してCookieを取得できるため、Cookieが設定されているようです

((CookieManager)client.getCookieHandler()).getCookieStore().get(new URI("http://www.example.com"));

ただし、を使用してクライアント呼び出しを実行しているとき

Request request = new Request.Builder().url("http://www.example.com/getdata.php").build(); 
client.newCall(request).execute();

Cookie はリクエストで送信されていません (Android プロキシを使用してこのネットワーク呼び出しを確認しました)。

okhttpクライアントがそのCookieを使用するようにそのようなCookieを設定する正しい方法は何ですか?

4

1 に答える 1

7

CookieHandlerの のput実装とCookieManagerCookieStoreメソッドには違いがあるようですadd

デフォルトでは、putfromを使用すると、ドメインと、実装によって内部的に作成されたCookieManagerへのパスが追加されます。の add メソッドを直接HttpCookie使用する場合、 .CookieStoreHttpCookie

結局のところ、あなたの場合は直接ではなく、実装からをOkHttp使用します。それはまた、あなたの場合には欠けているクッキーと一致させるために を使用します。getCookieManagerCookieStoregetpath

想定されるデフォルト パスの「/」を指定しHttpCookieないと、Cookie が見つかりません。

HttpCookie次に、好きなように変更する必要があります

HttpCookie cookie = new HttpCookie("PHPSESSID", getPhpSessionID());
cookie.setPath("/");
cookie.setVersion(0);
cookie.setDomain("www.example.com");
((CookieManager)client.getCookieHandler()).getCookieStore().add(new URI("http://www.example.com"), cookie);

または、実装を変更する可能性がある場合にソリューションの適応性を高めるためにCookieHandler、アクセスする代わりにインターフェイスのみを使用できます。CookieStore

あなたはこれを次のように達成します

List<String> values = new ArrayList<>(Arrays.asList("PHPSESSID=" + "your_session_id_here"));
Map<String, List<String>> cookies = new HashMap<>();
cookies.put("Set-Cookie", values);
client.getCookieHandler().put(new URI("http://www.example.com"), cookies);
于 2014-09-24T19:28:39.697 に答える