UniApp中通过自定义WebView及原生插件获取HttpOnly Cookie的实现

在开发uniapp应用时,有时需要在自定义的webview中获取带有HttpOnly属性的cookie,而由于安全限制,JavaScript无法直接访问HttpOnly cookie。为了解决这一问题,可以通过开发Android原生插件并引入到uniapp项目中,利用原生代码来获取cookie。

原生插件开发

  1. 创建Android项目:在Android Studio中创建一个新的Android项目,选择合适的模板和配置。

  2. 编写插件逻辑:在项目中创建一个Java类,例如CookiePlugin.java,用于实现获取cookie的功能。在类中定义一个方法,使用Android的CookieManager来获取cookie值。

    java复制

        /**
         * 获取所有Cookie,包括HttpOnly Cookie
         * @param url 网址
         * @param callback 回调函数,返回cookie信息
         */
        @UniJSMethod(uiThread = true)
        public void getCookies(String url, UniJSCallback callback) {
            try {
                CookieManager cookieManager = CookieManager.getInstance();
                String cookies = cookieManager.getCookie(url);
                if (callback != null) {
                    JSONObject data = new JSONObject();
                    data.put("cookies", cookies != null ? cookies : "");
                    data.put("status", "success");
                    callback.invoke(data);
                }
            } catch (Exception e) {
                Log.e(TAG, "获取Cookie失败: " + e.getMessage());
                if (callback != null) {
                    JSONObject data = new JSONObject();
                    data.put("cookies", "");
                    data.put("status", "error");
                    data.put("message", "获取Cookie失败");
                    callback.invoke(data);
                }
            }
        }
        /**
         * 重定向
         * 设置cookie 清除cookie等相似
         */
  3. 打包插件:在Android Studio中,通过Gradle构建工具将项目打包成.aar文件。在项目根目录下打开Gradle面板,选择插件模块,执行assembleRelease任务,生成的.aar文件位于build/outputs/aar目录下。

引入到uniapp项目

  1. 创建目录结构:在uniapp项目根目录下创建nativeplugins目录,然后根据插件名创建相应的子目录,例如CookiePlugin,再在其下创建android目录。

  2. 配置package.json文件:在nativeplugins/CookiePlugin/android目录下创建package.json文件,配置插件信息。

    JSON复制

    {
      "name": "CookiePlugin",
      "id": "com.example.cookieplugin",
      "version": "1.0.0",
      "description": "A plugin to get HttpOnly cookie in WebView",
      "_dp_type": "nativeplugin",
      "_dp_nativeplugin": {
        "android": {
          "plugins": [
            {
              "type": "module",
              "name": "CookiePlugin",
              "class": "com.example.cookieplugin.CookiePlugin"
            }
          ],
          "integrateType": "aar",
          "parameters": {}
        }
      }
    }
  3. 注册插件:在uniapp项目的manifest.json文件中,找到plugins配置项,添加刚才创建的插件。

    JSON复制

    {
      "plugins": {
        "CookiePlugin": {
          "path": "nativeplugins/CookiePlugin/"
        }
      }
    }
  4. 调用插件方法:在uniapp页面的JavaScript代码中,使用uni.requireNativePlugin方法引入插件,并调用插件中的方法来获取cookie。

    JavaScript复制

    const cookiePlugin = uni.requireNativePlugin('CookiePlugin');
    let cookie = cookiePlugin.getCookies('https://example.com');
    console.log('Cookie:', cookie);

通过以上步骤,我们成功地开发了一个Android原生插件,并将其引入到uniapp项目中,利用原生代码实现了在自定义webview中获取HttpOnly cookie的功能。这一方法绕过了JavaScript无法访问HttpOnly cookie的限制,为uniapp应用在特定场景下的开发提供了有效的解决方案。

注意:写插件的时候也要注意一下目录文件名称和包名,在引入和打包插件时,最好根据步骤配置好自定义插件在gradle中的版本号,appkey,证书,密码,文件名称等配置,在uniapp云打包中要注意在uniapp中个平台设置中的包名,manifest.json和package.json,层级目录如下:

nativeplugins/
└── webviewcookie/
    ├── android/
    │   └── webviewcookie-release.aar
    └── package.json

httponly设置说明用户对该隐私和信息的重要性声明,请合理理智的使用插件,尊重和保护用户隐私!

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐