如何使用OkHttp在Android上实现cookie处理?

Dan*_*iel 46 cookies android okhttp

使用OkHttp by Square https://github.com/square/okhttp,我该怎么做:

  1. 检索从服务器返回的cookie
  2. 存储cookie以用于即将到来的请求
  3. 在后续请求中使用存储的cookie
  4. 更新后续请求返回的cookie

理想情况下,每次请求都会自动存储,重新发送和更新cookie.

hid*_*dro 61

对于OkHttp3,一个简单的accept-all,非持久化CookieJar实现可以如下:

OkHttpClient client = new OkHttpClient.Builder()
    .cookieJar(new CookieJar() {
        private final HashMap<HttpUrl, List<Cookie>> cookieStore = new HashMap<>();

        @Override
        public void saveFromResponse(HttpUrl url, List<Cookie> cookies) {
            cookieStore.put(url, cookies);
        }

        @Override
        public List<Cookie> loadForRequest(HttpUrl url) {
            List<Cookie> cookies = cookieStore.get(url);
            return cookies != null ? cookies : new ArrayList<Cookie>();
        }
    })
    .build();
Run Code Online (Sandbox Code Playgroud)

或者如果您更喜欢使用java.net.CookieManager,请okhttp-urlconnection在您的项目中包含JavaNetCookieJar一个包含在其中的包装类java.net.CookieHandler:

dependencies {
    compile "com.squareup.okhttp3:okhttp:3.0.0"
    compile "com.squareup.okhttp3:okhttp-urlconnection:3.0.0"
}
Run Code Online (Sandbox Code Playgroud)
CookieManager cookieManager = new CookieManager();
cookieManager.setCookiePolicy(CookiePolicy.ACCEPT_ALL);
OkHttpClient client = new OkHttpClient.Builder()
    .cookieJar(new JavaNetCookieJar(cookieManager))
    .build();
Run Code Online (Sandbox Code Playgroud)

  • 顺便说一句,网址是服务器的"完整网址",它只会在向完全相同的网址发出请求时发送Cookie.您可能希望将`cookieStore.put(url,cookies);`替换为`cookieStore.put(url.host(),cookies);`对于loadForRequest,`coookieStore.get(url.host());`.并将`HashMap <HttpUrl,List <Cookie >>`替换为`HashMap <String,...>` (17认同)
  • 这是错的.`saveFromResponse`**替换**列表而不是**合并**.这意味着设置任何cookie都会删除先前请求中设置的所有cookie. (6认同)

Mig*_*gne 33

在OkHttp 3之前,您可以将CookieHandler传递给OkHttpClient实例.您可以使用java.net中的CookieManager实现,也可以根据需要实现自己的实现.选择最适合您需求的政策.

OkHttpClient client = new OkHttpClient();
CookieManager cookieManager = new CookieManager();
cookieManager.setCookiePolicy(CookiePolicy.ACCEPT_ALL);
client.setCookieHandler(cookieManager);
Run Code Online (Sandbox Code Playgroud)

OkHttp会将从响应中收到的cookie保存到CookieHandler中,并在发送请求时从中读取.它将匹配请求/响应URI.

  • 需要注意的重要事项:CookieManager不是持久的.下次启动应用程序时,cookie jar将为空. (26认同)
  • @JesseWilson你是对的.这是一个有助于坚持CoockieJar的库https://github.com/franmontiel/PersistentCookieJar (3认同)

hma*_*mac 7

我需要共享默认的Cookie Jar(CookieManager.getInstance()),所以这对我来说似乎没问题.

return new CookieJar() {

        @Override
        public void saveFromResponse(HttpUrl url, List<Cookie> cookies) {
            CookieManager cookieManager = CookieManager.getInstance();

            for (Cookie cookie : cookies) {
                cookieManager.setCookie(url.toString(), cookie.toString());
            }
        }

        @Override
        public List<Cookie> loadForRequest(HttpUrl url) {
            CookieManager cookieManager = CookieManager.getInstance();
            List<Cookie> cookies = new ArrayList<>();
            if (cookieManager.getCookie(url.toString()) != null) {
                String[] splitCookies = cookieManager.getCookie(url.toString()).split("[,;]");
                for (int i=0; i<splitCookies.length; i++) {
                    cookies.add(Cookie.parse(url, splitCookies[i].trim()));
                }
            }
            return cookies;
        }
    };
Run Code Online (Sandbox Code Playgroud)