16

私のアプリケーションでは、HttpGet リクエストから 2 つの Cookie を取得し、次のように CookieManager に保存しています。

//Clear old cookies
CookieManager.getInstance().removeAllCookie();
CookieSyncManager.getInstance().sync();

//Save the two cookies: auth token and session info
List<Cookie> cookies = httpclient.getCookieStore().getCookies();
if (cookies != null) {
    for (Cookie cookie : cookies) {
        String cookieString = cookie.getName() + "=" + cookie.getValue() + "; Domain=" + cookie.getDomain();
        CookieManager.getInstance().setCookie("http://alpha.mydomainname.com", cookieString);
    }

    System.out.println(CookieManager.getInstance().hasCookies()); //Prints false in 2.3,  true in 4.0.3

    CookieSyncManager.getInstance().sync();

    System.out.println(CookieManager.getInstance().hasCookies()); //Also prints false in 2.3 and true in 4.0.3
}

私は 2 つの異なるデバイスで同じコードをテストしていますが、4.0.3 では Cookie が正しく設定されています (また、アプリケーションの起動間で転送されます) が、2.3.3 では正しく設定されていません。設定されていないというのは、URL を指定すると、hasCookies() が false を返し、getCookie() が null を返すことを意味します。

setCookie を呼び出すときに、Cookie URL の可能なすべての組み合わせを試しました。 mydomainname.com」、「alpha.mydomainname.com」、「.mydomainname.com」、「www.mydomainname.com」、どれも機能しません。助けてください。

4

5 に答える 5

5

私は最近同様の問題を抱えていましたが、次の解決策がうまくいきました。最初に CookieSyncManager と CookieManager のインスタンスを作成/取得し、新しいインスタンスを再度作成する代わりに、コード全体でそれらを使用します。また、Cookie を正しいドメインに設定して実験する必要がありました。リダイレクトの 1 つに表示されるドメインに設定する必要がありました。

final CookieSyncManager cookieSyncManager = CookieSyncManager.createInstance(context);
final CookieManager cookieManager = CookieManager.getInstance();
cookieManager.setAcceptCookie(true);
cookieManager.removeSessionCookie();

//Save the two cookies: auth token and session info
List<Cookie> cookies = httpclient.getCookieStore().getCookies();
if (cookies != null) {
    for (Cookie cookie : cookies) {
        String cookieString = cookie.getName() + "=" + cookie.getValue() + "; Domain=" + cookie.getDomain();
        cookieManager.setCookie("http://mydomainname.com", cookieString);
    }
    cookieSyncManager.sync();
}
于 2014-08-05T00:42:26.273 に答える
1

Cookie にセミコロンを含めることはできません。セミコロンはセパレーター int Cookie を意味するためです。

于 2016-05-03T11:32:40.123 に答える
0

バックグラウンド スレッドを使用して Cookie を設定するプラグインを見つけました。

iOS 9およびAndroid 5でテスト済み:

https://github.com/kristianhristov/cordova-cookie-master

于 2015-09-25T20:25:45.580 に答える
0

でいくつかの奇妙な動作にも遭遇しましたがCookieManager、最終的には回避策である解決策になりましたが、機能します。
使用する代わりにCookieManager、http cookie ヘッダーを使用しただけなので、たとえば、次のように使用HttpUrlConnectionできます。

//Save the two cookies: auth token and session info
List<Cookie> cookies = httpclient.getCookieStore().getCookies();
if (cookies != null) {
for (Cookie cookie : cookies) {
    String cookieString = cookie.getName() + "=" + cookie.getValue();
    myHttpURLConnection.setRequestProperty("Cookie", cookieString);
}

もちろん、これらの Cookie を永続化する必要がある場合は、自分でそれを行い、後で使用するためにその値をどこかに保存する必要があります...

于 2013-04-04T11:19:11.830 に答える