使用OkHttp 3自动处理cookie

use*_*763 33 cookies okhttp3

我正在使用okhttp 3.0.1.

每个我在哪里获得与okhttp2一起进行cookie处理的例子

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

可以请一些人指导我如何在版本3中使用.在版本3中不存在setCookieHandler方法.

fra*_*iel 52

如果你想使用新的OkHttp 3 CookieJar并摆脱okhttp-urlconnection依赖关系,你可以使用这个PersistentCookieJar.

您只需要创建一个实例,PersistentCookieJar然后将其传递给OkHttp构建器:

CookieJar cookieJar =
                    new PersistentCookieJar(new SetCookieCache(), new SharedPrefsCookiePersistor(context));

OkHttpClient okHttpClient = new OkHttpClient.Builder()
                    .cookieJar(cookieJar)
                    .build();
Run Code Online (Sandbox Code Playgroud)


1f7*_*1f7 34

现在我正在玩它.尝试PersistentCookieStore,为JavaNetCookieJar添加gradle依赖项:

compile "com.squareup.okhttp3:okhttp-urlconnection:3.0.0-RC1"

和init

    // init cookie manager
    CookieHandler cookieHandler = new CookieManager(
            new PersistentCookieStore(ctx), CookiePolicy.ACCEPT_ALL);
    // init okhttp 3 logger
    HttpLoggingInterceptor logging = new HttpLoggingInterceptor();
    logging.setLevel(HttpLoggingInterceptor.Level.BODY);
    // init OkHttpClient
    OkHttpClient httpClient = new OkHttpClient.Builder()
            .cookieJar(new JavaNetCookieJar(cookieHandler))
            .addInterceptor(logging)
            .build();
Run Code Online (Sandbox Code Playgroud)

`

  • 仅供参考:在不久的将来,他们计划删除okhttp-urlconnection模块.github.com/square/okhttp/blob/master/CHANGELOG.md (5认同)

小智 17

在这里,您可以使用一种简单的方法来创建自己的CookieJar.它可以根据需要扩展.我所做的是实现一个CookieJar并使用OkHttpClient.Builder和这个CookieJar构建OkHttpClient.

public class MyCookieJar implements CookieJar {

    private List<Cookie> cookies;

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

    @Override
    public List<Cookie> loadForRequest(HttpUrl url) {
        if (cookies != null)
            return cookies;
        return new ArrayList<Cookie>();

    } 
}
Run Code Online (Sandbox Code Playgroud)

以下是如何创建OkHttpClient的方法

OkHttpClient.Builder builder = new OkHttpClient.Builder();
builder.cookieJar(new MyCookieJar());
OkHttpClient client = builder.build();
Run Code Online (Sandbox Code Playgroud)

  • 安全警告:此CookieJar实现将所有cookie发送到所有站点.切勿在生产中使用它! (11认同)
  • 这实际上很棒!我的猜测是,人们抱怨它不起作用并没有意识到他们需要在整个应用程序中使用相同的MyCookieJar实例,以便cookie在其他地方工作.此外,他们需要了解cookie不会在应用程序启动时持续存在(一旦应用程序被杀死并释放内存,因为它们没有被存储.对我来说,这是完美的. (4认同)
  • 正如 vonox7 指出的那样,这个解决方案在安全方面是令人厌恶的。xyman 提供了类似的解决方案,仅向给定主机发送 cookie:http://stackoverflow.com/a/37478166/1220560 (2认同)

Shu*_*ham 12

添加 compile "com.squareup.okhttp3:okhttp-urlconnection:3.8.1" 到build.gradle.

然后加入

 CookieManager cookieManager = new CookieManager();
 cookieManager.setCookiePolicy(CookiePolicy.ACCEPT_ALL);

 OkHttpClient defaultHttpClient = new OkHttpClient.Builder()
                                 .cookieJar(new JavaNetCookieJar(cookieManager))
                                 .build()
Run Code Online (Sandbox Code Playgroud)

帮助我没有添加任何第三方依赖,除了来自OkHttp的依赖.


xym*_*man 11

这是OkHttp3的CookieJar实现.如果你有多个OkHttp3实例(通常你应该只有一个实例并将其用作单一实例),你应该为所有的http客户端设置相同的cookiejar实例,这样他们就可以共享cookie!此实现不是持久性cookie(它们将在应用程序重新启动时全部丢弃)但应该很容易实现SharedPreferences持久性而不是内存中的cookie列表(cookieStore).

    CookieJar cookieJar = new CookieJar() {
        private final HashMap<String, List<Cookie>> cookieStore = new HashMap<>();

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

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

  • 存储cookie时至少使用cookie.domain()以确保它们可以再次正确读取. (2认同)

ima*_*yni 5

我将franmontiel PeristentCookieJar库用于 okhttp3 和 retrofit.2。这种方法的好处是:不需要操纵您的 okhttp 请求。创建改造时只需设置 cookie 或会话

1. 首先将此添加到您的 build.gradle(projectname)
 allprojects {
     repositories {
         jcenter()
         maven { url "https://jitpack.io" }
     }
 }
Run Code Online (Sandbox Code Playgroud) 2. 将此添加到您的 build.gradle
    compile 'com.github.franmontiel:PersistentCookieJar:v1.0.1'
Run Code Online (Sandbox Code Playgroud) 3. 像这样构建改造
public static Retrofit getClient(Context context) {

            ClearableCookieJar cookieJar = new PersistentCookieJar(new SetCookieCache(), new SharedPrefsCookiePersistor(context));
            OkHttpClient okHttpClient = new OkHttpClient.Builder()
                    .cookieJar(cookieJar)
                    .build();
            if (retrofit==null) {
                retrofit = new Retrofit.Builder()
                        .baseUrl(BASE_URL)
                        .addConverterFactory(GsonConverterFactory.create())
                        .client(okHttpClient)
                        .build();
            }
            return retrofit;
        }
Run Code Online (Sandbox Code Playgroud)