Flutter webview 拦截所有请求并添加 headers

2023-11-24

使用 webview_flutter 包我可以加载我的网站并将会话 cookie 添加到初始 URL。

_controller.future.then((controller) {
  _webViewController = controller;
  Map<String, String> header = {'Cookie': 'ci_session=${widget.sessionId}'};
  _webViewController.loadUrl('https://xxxx.com', headers: header);
});

为了保持会话继续,我需要为所有请求添加相同的标头,而不仅仅是第一个请求。 有什么方法可以拦截所有请求并通过向其添加标头来修改它们吗?

我发现的最接近的东西是navigationDelegate但它只返回一个NavigationDecision这对我来说没有用。


你可以使用我的插件flutter_inappwebview,这是一个 Flutter 插件,允许您添加内联 WebView 或打开应用内浏览器窗口,并且有很多事件、方法和选项来控制 WebView。

如果您需要为每个请求添加自定义标头,您可以使用shouldOverrideUrlLoading事件(您需要使用启用它useShouldOverrideUrlLoading: true选项)。

相反,如果您需要向 WebView 添加 cookie,您只需使用CookieManager class (CookieManager.setCookie设置 cookie 的方法)。

这是一个设置 cookie 的示例(名为ci_session)在你的WebView中,并设置一个自定义标题(名为My-Custom-Header) 对于每个请求:

import 'dart:async';
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:flutter_inappwebview/flutter_inappwebview.dart';

Future main() async {
  WidgetsFlutterBinding.ensureInitialized();
  runApp(MyApp());
}

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => new _MyAppState();
}

class _MyAppState extends State<MyApp> {
  InAppWebViewController webView;
  CookieManager _cookieManager = CookieManager.instance();

  @override
  void initState() {
    super.initState();

    _cookieManager.setCookie(
      url: "https://github.com/",
      name: "ci_session",
      value: "54th5hfdcfg34",
      domain: ".github.com",
      isSecure: true,
    );
  }

  @override
  void dispose() {
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('InAppWebView Example'),
        ),
        body: Container(
            child: Column(children: <Widget>[
          Expanded(
              child: InAppWebView(
            initialUrl: "https://github.com/",
            initialHeaders: {'My-Custom-Header': 'custom_value=564hgf34'},
            initialOptions: InAppWebViewGroupOptions(
              crossPlatform: InAppWebViewOptions(
                debuggingEnabled: true,
                useShouldOverrideUrlLoading: true
              ),
            ),
            onWebViewCreated: (InAppWebViewController controller) {
              webView = controller;
            },
            onLoadStart: (InAppWebViewController controller, String url) {},
            onLoadStop: (InAppWebViewController controller, String url) async {
              List<Cookie> cookies = await _cookieManager.getCookies(url: url);
              cookies.forEach((cookie) {
                print(cookie.name + " " + cookie.value);
              });
            },
            shouldOverrideUrlLoading: (controller, shouldOverrideUrlLoadingRequest) async {
              print("URL: ${shouldOverrideUrlLoadingRequest.url}");

              if (Platform.isAndroid || shouldOverrideUrlLoadingRequest.iosWKNavigationType == IOSWKNavigationType.LINK_ACTIVATED) {
                controller.loadUrl(url: shouldOverrideUrlLoadingRequest.url, headers: {
                  'My-Custom-Header': 'custom_value=564hgf34'
                });
                return ShouldOverrideUrlLoadingAction.CANCEL;
              }
              return ShouldOverrideUrlLoadingAction.ALLOW;
            },
          ))
        ])),
      ),
    );
  }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Flutter webview 拦截所有请求并添加 headers 的相关文章

随机推荐

  • 如何配置 Devise for Ruby on Rails 将电子邮件和密码存储在用户模型之外的其他位置?

    我想将电子邮件存储在单独的表中 并允许用户保存多封电子邮件并使用其中任何电子邮件登录 我还想将密码存储在不同的表中 如何配置 Devise 将身份验证信息存储在其他地方 最坏的情况是 如果我必须侵入它 是否有一个生成器可以将所有内容移植到应
  • 锁定自定义选项卡的方向

    我想使用 Chrome 自定义选项卡锁定方向 这是我可以使用低级 API 完成的事情还是我需要为此功能添加新方法 我的用例是 我有一个具有自定义选项卡的应用程序 我希望它始终以纵向显示自定义选项卡 而不是横向显示 自定义选项卡当前不提供允许
  • 从设置中获取动态属性

    我的 AppConfig 中存储了一些属性 现在我想动态访问它们 例如在循环或函数中 使用 MySettings NAME OF THAT THING 访问值没有问题 但如果名称是变量怎么办 I tried String propertyV
  • 如何沿 axis=1 进行 DataFrame.groupby

    I have df pd DataFrame A 1 2 3 B 1 2 6 df A B 0 1 1 1 2 2 2 3 6 问 我如何获得 A 0 1 1 2 2 1 5 using groupby and aggregate 就像是
  • 使用值数组将 numpy 分组为多个子数组

    我有一系列沿直线的点 a np array 18 56 32 75 55 55 我有另一个数组 它对应于我想用来访问 a 中的信息的索引 它们始终具有相等的长度 两个数组都没有a也不数组b已排序 b np array 0 2 3 2 2 2
  • 警告:openssl_pkcs7_sign() [function.openssl-pkcs7-sign]:在第 8366 行的 C:\xampp\htdocs\this\tcpdf\tcpdf.php 中获取私钥时出错

    我正在使用 TCPDF 来签署 PDF 但是在运行时实施例52我收到这个错误 Warning openssl pkcs7 sign function openssl pkcs7 sign error getting private key
  • 为什么循环要分配最后一个索引元素的引用? [复制]

    这个问题在这里已经有答案了 我想为我的所有标签添加一个事件侦听器 每个传递一个对其自身的引用作为触发事件时的参数 这是我写的函数 function validateDigitsFeature Add the event listeners
  • Bootstrap 模式使滚动条在关闭后消失

    我在 StackOverflow 上读到了很多关于这个主题的解决方案 技巧 但似乎没有一个对我有用 我正在使用模式登录 Meteor 例如使用 Facebook 登录服务 并在登录成功时触发回调 我将其放在回调中以关闭模式 modalSig
  • Web 驱动程序卷曲异常

    尝试使用Codeception Web Driver和Selenium通过验收测试来模拟ajax 我正在使用 PhpBrowser 但当我遇到 Ajax 问题时 我的朋友建议使用 WebDriver 启用它并下载 selenium 并运行它
  • 接口作为参数或泛型方法与 where - 有什么区别?

    之间有什么区别 public void Method1
  • 静态方法中的全局变量

    这看起来很基本 但我发现这很微不足道 简而言之 您建议如何使用静态类 即控制台应用程序 设置全局变量 为了给您更多背景知识 主要方法是调用一些自定义事件处理程序 我希望它们能够获取 设置变量 如果您有任何想法或建议 我们将不胜感激 最简单的
  • Doctrine2:如果不选择至少一个根实体别名,则无法通过标识变量选择实体

    我被一个原本非常简单的学说 2 查询困住了 我有一个名为 Category 的实体 它与其自身具有 OneToMany 关系 对于父类别和子类别 ORM ManyToOne targetEntity Category inversedBy
  • 使用 Foreach 子句的 Lambda 表达式 [重复]

    这个问题在这里已经有答案了 可能的重复 为什么 IEnumerable 接口上没有 ForEach 扩展方法 EDIT 作为参考 这是埃里克在评论中提到的博客文章 https ericlippert com 2009 05 18 forea
  • 从 Excel 到 R 的日期,平台依赖性

    我正在导入xls文件使用gdata 我正在使用转换日期列as Date转换日期 根据手册as Date 日期来源取决于平台 因此我正在确定相应地使用哪个来源 origin lt ifelse Sys info sysname Windows
  • 从 arraybuffer 显示 pdf

    我从这段代码中返回来自 laravel dompdf 的流数据 pdf App make dompdf wrapper pdf gt loadHTML div This is test div return pdf gt stream 这是
  • 如果为 null 或为空,则不插入字段

    我有一个带有一些字段的 C 类 其中一些字段为空 那些为空的我不想将其插入到具有空值的数据库中 我根本不想将它们插入数据库 我该如何实现这一目标 class User public string FirstName public strin
  • HTML 文件上传字段样式

    我正在尝试创建一个具有一点风格的文件上传字段 但我似乎在查找此类示例时遇到问题 我知道部分原因是该字段本身因浏览器而异 有什么想法如何做到这一点 或者有没有一种方法可以在不使用可设置样式的表单的文件元素的情况下执行此操作 如果您的意思是文件
  • 在react-admin中访问redux store

    我的问题与反应管理 repo 我想在组件范围之外分派一个操作 以便做到这一点 我读过我需要访问实际的 redux 存储本身 并直接调度 所以我知道Admin组件有一个initialStateprop 但它只接受默认状态对象 而不接受存储 所
  • Rails 5 如何在多个共享属性的表之间形成关联

    在 Rails 5 中 给定两个表之间的关系涉及在多个共享属性上连接它们 我如何在与这些表对应的模型之间形成关联 SQL SELECT FROM trips JOIN stop times ON trips guid stop times
  • Flutter webview 拦截所有请求并添加 headers

    使用 webview flutter 包我可以加载我的网站并将会话 cookie 添加到初始 URL controller future then controller webViewController controller Map