首页 > 解决方案 > 如何处理 okhttpclient 请求的 cookie

问题描述

我正在使用 OkHttpClient 向网站的网页 url 发送请求,并通过仅从 stackoverflow 获得的以下方法存储它提供的 cookie。

CookieManager cookieManager = new CookieManager();
cookieManager.setCookiePolicy(CookiePolicy.ACCEPT_ALL);
ClearableCookieJar cookieJar = new PersistentCookieJar(new SetCookieCache(), new SharedPrefsCookiePersistor(this));
OkHttpClient client = new OkHttpClient.Builder()
                .cookieJar(cookieJar)
                .build();
Request request = new Request.Builder()
                .url("www.example.com/homePage")
                .addHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:73.0) Gecko/20100101 Firefox/73.0")
                .build();

必须存储 cookie,否则网站会将请求重定向到超时页面。

然后,我查看页面的 html 以检查我是否到达了正确的 URL。

client.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                e.printStackTrace();
                textView.setText("Failed to get response");
            }
            @Override
            public void onResponse(Call call, Response response) throws IOException {
                if(response.isSuccessful()){
                    //String myResponse contains the html of the webpage 
                    final String myResponse = response.body().string();
                    MainActivity.this.runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            textView.setText(myResponse);
                        }
                    });
                }
            }
        });

现在,我以与 URL“www.example.com/loginPage”类似的方式创建另一个请求变量,并尝试查看 html,但它会将我重定向到超时页面,因为发出请求时没有发送我从中获得的 cookie主页。

因此,简而言之,我如何从“www.example.com/cookieProviderPage”获取 cookie 并将其存储,然后将该 cookie 用于对该网站所有页面的所有进一步请求。该网站的页面具有不同的 URL,例如“www.example.com/cookieRequiredPage1”、“www.example.com/cookieRequiredPage2”等。

PS - 我已经检查了许多与 cookie 有关的 stackoverflow 问题,但我无法针对我的情况专门实施它们。

标签: androidcookiessession-cookiesokhttp

解决方案


使用命令添加的 Cookie

new OkHttpClient.Builder()
  .cookieJar(cookieJar)

根据CookieJar.loadForRequest方法加载。您必须检查您的接口CookieJar实现如何实现该loadForRequest方法。如果 cookie 只是为与 cookie 最初来自的完全相同的 url 加载的,则您会遇到错误。如果 cookie 来自“www.example.com/cookieProviderPage”并且您想为请求“www.example.com/loginPage”提供 cookie,则您的CookieJar实现可能只向 url 为“www.example”的请求提供 cookie .com/cookieProviderPage”。例如,如果Cookie.matches用于获取请求的 cookie,就是这种情况。Cookie.matches比较 url 的域名和路径。


推荐阅读