android - 如何处理 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 问题,但我无法针对我的情况专门实施它们。
解决方案
使用命令添加的 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 的域名和路径。
推荐阅读
- php - MySQL 结果成数组
- gcc - 如何查看 gcc 优化选项?
- delphi - Marks.Item[nPoint].Visible 之后的 TeeChart CalcClickedPart 错误:=false
- angular - 我可以从 `canActivate: AuthGuard` 中读取路由参数的值吗?
- r - 从不同的 html 文件创建唯一文件名时出现问题
- ios - 动画文本字段像 Messenger 和 Whatsapp 一样扩展
- python - 如何从Python中的字符串中获取两个特定字符之间的一段字符串
- python - django 查询没有正确分组
- c++ - 有必要使用std::move吗?这不是已经是右值引用了吗?
- r - 如何使用另一个数据框中的字段值调用包含列的值