1

我有一个来自服务器的 cookie,我将此 cookie 保存在共享首选项中。当我从 Ion 库向服务器发送请求时,它会正常运行,因为我已登录应用程序并且 Ion 有这个 cookie。当我关闭应用程序并重新打开时,Ion 有我的 cookie。问题是当我销毁应用程序时,Ion 不再有这个 cookie。当我向服务器请求查询时,它会给我一个新的 cookie,而 Ion 有这个新的 cookie。所以,我需要为 Ion 库建立旧的 cookie。

我试图在标题中设置cookie:

String cookieString = ApiConstants.API_COOKIE_NAME + "=" + cookie;
headers.add(new BasicNameValuePair("Cookie", cookieString));

if (headers != null) {
    for (int i = 0; i < headers.size(); i++) {
        b = b.addHeader(headers.get(i).getName(), headers.get(i).getValue());
    }
}

我尝试将此 cookie 添加到 CookieManager:

CookieManager cookieManager = CookieManager.getInstance();
CookieSyncManager.createInstance(context);

cookieManager.setAcceptCookie(true);
cookieManager.setCookie(ApiConstants.BASIC_ROOT_URL, cookieString);
CookieSyncManager.getInstance().sync();

但是,这些尝试都没有消失,有人可以帮助我吗?

4

1 回答 1

0

这是一个古老的问题,但我想如果只是为了我自己,我会发布它。

这并不像看起来那么难,但是如果没有文档,您必须查看测试用例才能弄清楚。我已经使用了我使用过的代码并将其包装在一个辅助类中。你肯定可以用它做更多的事情(设置过期和什么不),但这应该足以满足海报的要求:

package com.example;


import android.content.Context;

import com.koushikdutta.async.http.Headers;
import com.koushikdutta.ion.Ion;

import java.io.IOException;
import java.net.CookieManager;
import java.net.URI;
import java.net.URLConnection;
import java.util.ArrayList;
import java.util.List;

/*
This is adapted from my own code... so I'm not sure this will work exactly like this but it'll give you a starting point
*/
public class IonCookieManager {
    CookieManager manager;

    public IonCookieManager(Context context) {
        Ion ion = Ion.getDefault(context);
        manager = ion.getCookieMiddleware().getCookieManager();
    }

    public void storeCookies(URLConnection conn) throws IOException {

        List<String> cookies = conn.getHeaderFields().get("Set-Cookie");
        URI uri = URI.create(conn.getURL().toString());
        if(cookies != null) {
            storeCookies(uri, cookies);
        }
    }

    public void storeCookies(URI uri, List<String> cookies) throws IOException {
        Headers headers = new Headers();
        headers.addAll("Set-Cookie", cookies);

        manager.put(uri, headers.getMultiMap());
    }

    public void storeCookie(URI uri, String cookieName, String cookieValue) throws IOException {
        List<String> cookie = new ArrayList<String>();
        cookie.add(String.format("%s=%s", cookieName, cookieValue));
        storeCookies(uri, cookie);
    }

}

也作为一个要点

于 2014-11-13T17:49:12.093 回答