OkHTTPClient将cookie传递给Webview

2023-12-22

我通过 OKHttpClient 帖子以用户身份登录,我想与 webview 共享 cookie。


使用 OkHttp 3.0,您可以使用类似于与 HttpURLConnection 共享的方法,通过创建使用 webkit cookie 存储的 WebkitCookieManagerProxy。改编自将 cookie 从 HttpURLConnection (java.net.CookieManager) 传递到 WebView (android.webkit.CookieManager) https://stackoverflow.com/questions/12731211/pass-cookies-from-httpurlconnection-java-net-cookiemanager-to-webview-android/12731212 .

public class WebkitCookieManagerProxy extends CookieManager implements CookieJar {
    private android.webkit.CookieManager webkitCookieManager;

    private static final String TAG = WebkitCookieManagerProxy.class.getSimpleName();

    public WebkitCookieManagerProxy() {
        this(null, null);
    }

    WebkitCookieManagerProxy(CookieStore store, CookiePolicy cookiePolicy) {
        super(null, cookiePolicy);
        this.webkitCookieManager = android.webkit.CookieManager.getInstance();
    }

    @Override
    public void put(URI uri, Map<String, List<String>> responseHeaders)
            throws IOException {
        // make sure our args are valid
        if ((uri == null) || (responseHeaders == null))
            return;

        // save our url once
        String url = uri.toString();

        // go over the headers
        for (String headerKey : responseHeaders.keySet()) {
            // ignore headers which aren't cookie related
            if ((headerKey == null)
                    || !(headerKey.equalsIgnoreCase("Set-Cookie2") || headerKey
                            .equalsIgnoreCase("Set-Cookie")))
                continue;

            // process each of the headers
            for (String headerValue : responseHeaders.get(headerKey)) {
                webkitCookieManager.setCookie(url, headerValue);
            }
        }
    }

    @Override
    public Map<String, List<String>> get(URI uri,
            Map<String, List<String>> requestHeaders) throws IOException {
        // make sure our args are valid
        if ((uri == null) || (requestHeaders == null))
            throw new IllegalArgumentException("Argument is null");

        // save our url once
        String url = uri.toString();

        // prepare our response
        Map<String, List<String>> res = new java.util.HashMap<String, List<String>>();

        // get the cookie
        String cookie = webkitCookieManager.getCookie(url);

        // return it
        if (cookie != null) {
            res.put("Cookie", Arrays.asList(cookie));
        }

        return res;
    }

    @Override
    public CookieStore getCookieStore() {
        // we don't want anyone to work with this cookie store directly
        throw new UnsupportedOperationException();
    }

    @Override
    public void saveFromResponse(HttpUrl url, List<Cookie> cookies) {
        HashMap<String, List<String>> generatedResponseHeaders = new HashMap<>();
        ArrayList<String> cookiesList = new ArrayList<>();
        for(Cookie c: cookies) {
            // toString correctly generates a normal cookie string
            cookiesList.add(c.toString());
        }

        generatedResponseHeaders.put("Set-Cookie", cookiesList);
        try {
            put(url.uri(), generatedResponseHeaders);
        } catch (IOException e) {
            Log.e(TAG, "Error adding cookies through okhttp", e);
        }
    }

    @Override
    public List<Cookie> loadForRequest(HttpUrl url) {
        ArrayList<Cookie> cookieArrayList = new ArrayList<>();
        try {
            Map<String, List<String>> cookieList = get(url.uri(), new HashMap<String, List<String>>());
            // Format here looks like: "Cookie":["cookie1=val1;cookie2=val2;"]
            for (List<String> ls : cookieList.values()) {
                for (String s: ls) {
                    String[] cookies = s.split(";");
                    for (String cookie : cookies) {
                        Cookie c = Cookie.parse(url, cookie);
                        cookieArrayList.add(c);
                    }
                }
            }
        } catch (IOException e) {
            Log.e(TAG, "error making cookie!", e);
        }
        return cookieArrayList;
    }

}

然后在构建 OkHttpClient 时添加代理实例作为 cookieJar。

client = new OkHttpClient.Builder().cookieJar(proxy).build();
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

OkHTTPClient将cookie传递给Webview 的相关文章

  • 当活动被破坏时如何保存状态

    public class Talk extends Activity private ProgressDialog progDialog int typeBar TextView text1 EditText edit Button res
  • 在 ubuntu 中找不到 .android 文件夹 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我在哪里可以找到 android在 Ubuntu 中 我想使用debug keystore 转到您的主文件夹并按 ctrl h 瞧
  • 禁用 com.google.android.maps.MapView 中的平移/缩放

    如何禁用 MapView 的平移 缩放功能 不是缩放控件 我想要一个完全静态的地图 我还注意到触摸地图似乎不会触发 MapView onClickListener 有人可以详细说明为什么吗 对于 Android 版 Google Maps
  • Android任务执行中的“platformAttrExtractor”是什么?

    我介绍了我的构建关注者操作说明 https developer android com studio build optimize your build html profile在安卓中 gradlew profile recompile
  • 在android Gridview中合并行和列

    我正在android中做一个图像查看页面 我需要在某些地方合并行 在某些地方合并列 我们可以在gridview中做到这一点吗 如果我们选择任何合并图像 则应选择整个图像视图 请任何人告诉我一个建议 提前致谢 Try 非对称网格视图 http
  • 具有自定义厚度的虚线分隔符

    我有一个虚线分隔符
  • 如何检查 Android 设备是否在线

    我的服务器不断检查我的 Android 应用程序是否在线 请问我可以在我的android应用程序上执行哪些操作 创建一个名为 isNetworkAvailable 的帮助器方法 该方法将根据网络是否可用返回 true 或 false 它看起
  • 通过模拟器控制台或 ADB 更改 Android 模拟器方向

    我正在尝试构建一个自动化测试框架 用于检查应用程序应该响应的基本内容 而不会崩溃 其中之一是检查应用程序是否正确响应配置更改 现在 由于它是自动化的 我必须以编程方式在横向和纵向之间切换模拟器的方向 并观察它是否崩溃 大写 因为有很多与 c
  • 如何在启用抗锯齿的情况下旋转可绘制对象

    我需要将 ImageView 旋转几度 我通过子类化 ImageView 和重载来做到这一点onDraw Override protected void onDraw Canvas canvas canvas save canvas sca
  • NDK8d 未找到 std::string 操作(即 stol、stoi)

    我尝试使用 ndk r8d 和 c 11 支持来建立我的第一个 android 项目 一些 c 11 机制工作正常 即 lambda 表达式 但是当我尝试时 使用新的字符串操作之一 编译失败 错误 stol 不是 std 的成员 这是我的
  • Android 上的 SQLite JDBC 驱动程序

    我正在尝试使用xerial sqlite jdbc在 Android 中管理我的数据库没有成功 我得到了java lang NoClassDefFoundError org sqlite SQLiteConnection异常 我已经导入了这
  • Proguard 正在破坏我的清洁度。 Gson 和泛型

    我有一个从持久性加载信息的函数 我只是以一种非常简单的方式告诉它的类型 该类称为SharedPreferencesHelper kt所以它是一个真正的生活问题解决者 fun
  • 线性布局高度和重量

    我有以下内容
  • 无法使用 Zxing Android 扫描 Code 128

    我已将 ZXing 条码阅读器集成到我的 Android 应用程序中 它可以扫描大部分代码 但我有一张电费单 它无法扫描 使用 Galaxy Ace 5 0MP 我认为问题是由于相机分辨率和焦点造成的 因为当我使用 Xperia SL 12
  • Recyclerview项目点击涟漪效果[重复]

    这个问题在这里已经有答案了 我正在尝试添加Ripple影响到RecyclerView的项目 我在网上查了一下 但找不到我需要的东西 我努力了android background归因于RecyclerView本身并将其设置为 android
  • 我想要有条件的登录导航,没有 MAIN 片段或按钮

    我正在使用 Android Jetpack 导航组件 实时数据和 Firebase 我希望工作流程就像用户打开应用程序时一样 然后根据登录 注销状态导航到登录 配置文件片段 而不需要任何主片段或按钮 请 我的应用程序中没有主要片段 用户启动
  • 带有不透明导航栏的深色文本透明状态栏

    等等 这不是重复的 类似的问题已被问到here https stackoverflow com questions 38025865 android fully transparent status bar with non transpa
  • 永久删除Android文件

    我发现了一个名为这会从 Android 设备中永久删除文件和文件夹 以便删除的文件无法再恢复 这是我正在谈论的应用程序 但我想知道如何做到这一点 我知道它是用 android studio 制作的 i尝试了常规的删除方式file delet
  • 从 Dropbox 下载文件并将其保存到 SDCARD

    现在我真的很沮丧 我想从 Dropbox 下载一个文件并将该文件保存到 SD 卡中 我得到的代码为 private boolean downloadDropboxFile String dbPath File localFile throw
  • PhoneGap Build Android 不显示闪屏

    这是我的 config xml 中与启动屏幕相关的代码

随机推荐

  • 使用 java.awt.Robot 测试键盘输入

    我有一个使用 java awt Robot 来练习自定义 Swing 组件的测试 我想在我们的构建服务器中运行测试 但构建服务器在锁定的 Windows 计算机上运行 并且 Robot keyPress char 无法在屏幕锁定的情况下工作
  • Yii2:从gridView复选框列获取选定行数据到控制器中

    我已查看页面 index php 在我的 Yii2 项目中 我正在使用Kartik网格视图用于显示数据 这是来自index php的视图 在视图的右侧 我有一个复选框列 我有一个Export按钮 我想将选定的名称 通过复选框选择 导出到na
  • jaxws:客户端地址属性无法解析占位符

    现在遇到最奇怪的问题 有一个 Spring XML 文件 其中 jaxws client 的地址属性使用地址属性的属性占位符 但它拒绝解析地址属性 这是日志文件错误 Caused by java net MalformedURLExcept
  • Helm Charts 在不同的命名空间中创建秘密

    我有以下内容secrets yaml in templetes在 Helm 图表中 apiVersion v1 kind Secret metadata name mysecret type Opaque data USER NAME YW
  • 在 iOS 中的 Storyboard 中使用模糊背景

    我在 iOS 8 上使用 Swift 我正在向 UiViewController 添加一个 子 视图 这个子视图应该包含一些 UiLabel 其中包含一些信息 我希望子视图有一个模糊的背景 就像iOS的通知中心一样 我知道使用 UIEffe
  • 在XBee ZigBee中,如何从协调器获取所有终端设备的RSSI

    获取每个终端设备的 RSSI 的正确方法是什么 场景 在 XBee 系列 2 无线电模块上使用 ZigBee 固件 API 模式 我有一个协调器和多个终端设备 每隔几秒钟 每个终端设备都会向协调器发送一个数据包 其中包含传感器信息 例如温度
  • Android 中主机卡模拟的编辑功能

    我目前正在为我的大学课程开发一个项目 其中我希望编辑 Android 的 HCE 功能的功能 以允许我在模拟卡时设置自己的 UID 现在 我已经下载了 AOSP 源代码 并构建了一个无需编辑代码的自定义映像 并将其安装到我的 Nexus 7
  • 抑制 python 警告

    当我在 for 循环中迭代时 我不断收到相同的警告 我想抑制该警告 警告内容如下 C Users Nick Alexander AppData Local Programs Python Python37 lib site packages
  • 如何摆脱 InvalidClassException SerialVersionUID?

    我在数据库中保存了一个 java 对象 几天后我更改了我的 jre 版本 现在 当我尝试读取同一个对象时 我收到以下异常 Exception in thread main java io InvalidClassException Seri
  • Dapper 示例代码的说明

    我正在尝试理解 Dapper 似乎缺少一些非常基本的东西 有人可以解释一下从 Google 代码上的 Dapper 主页获取的以下代码 并解释为什么没有 From 子句 以及 Query 方法的第二个参数 动态 传递了一个匿名类型 我认为这
  • 使用已知函数 numpy 进行曲线拟合

    我有一个 x 和 y 一维 numpy 数组 我想用已知函数重现 y 以获得 beta 这是我正在使用的代码 import numpy as np import matplotlib pyplot as plt from scipy opt
  • diff 2个大型数据库表

    给定 2 个大表 想象一下数亿行 每个表都有一个字符串列 如何获得差异 查看开源 Percona 工具包 具体来说 pt 表同步 http www percona com doc percona toolkit pt table sync
  • 我了解 Perl 5。学习 Perl 6 比转向 Python 有什么优势? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • Facebook iOS SDK - 移动应用程序安装跟踪不起作用

    我在我的应用程序中使用 Facebook SDK 版本 4 5 1 APP ID URL 方案 应用程序显示名称等已正确合并到 info plist 中 我们的应用程序内有身份验证和共享功能 所有这些功能都按预期完美运行 对于事件跟踪 我们
  • jQuery UI Datepicker 和 Google Chrome 不工作

    我在使用 jQueryUI Datepicker 和 Google Chrome 时遇到一些问题 我的日期选择器在 IE8 Firefox 和 Safari 上按预期工作 问题是在 Chrome 中单击日期选择器连接的文本框时 它给了我一个
  • 如何将两个windows vc静态库合并为一个

    我有两个静态库a lib and b lib C语言的 它是使用VC6 Visual studio 6 0 生成的 我想将这两个库合并为一个静态库c lib 如何在 CLI 模式下执行此操作 我见过合并 nix 静态库 https stac
  • Firebase Storage 和 Dropzone.js 按下按钮时上传多个图像

    本质上我想做的是允许人们添加文件 然后按下按钮将图像上传到 Firebase 存储 我决定使用 Dropzone js 因为该包编写良好且可自定义 但我仍然感到困惑 我有这段代码 允许我将多个图像上传到 Firebase 但是 我希望它适合
  • 如果两个指针都转换为整数类型,则比较两个指针是否具有 < 未定义行为?

    假设我有这段代码 可以根据内存块的位置按特定顺序将一个内存块复制到另一个内存块 void my memmove void dest const void src size t len const unsigned char s const
  • java.lang.NoClassDefFoundError:无法初始化类 javax.imageio.ImageIO jboss EAP 6

    我们正在使用 JBoss EAP 6 直到生产环境一切正常 但是在生产环境中部署后 我们收到以下错误 java lang NoClassDefFoundError Could not initialize class javax image
  • OkHTTPClient将cookie传递给Webview

    我通过 OKHttpClient 帖子以用户身份登录 我想与 webview 共享 cookie 使用 OkHttp 3 0 您可以使用类似于与 HttpURLConnection 共享的方法 通过创建使用 webkit cookie 存储