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

标签 android flutter webview interceptor

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

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

为了保持 session 继续进行,我需要为所有请求添加相同的 header ,而不仅仅是初始请求。
有没有办法拦截所有请求并通过向它们添加 header 来修改它们?

我找到的最接近的东西是navigationDelegate但它只返回 NavigationDecision这对我来说没有用。

最佳答案

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

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

相反,如果您需要将 cookie 添加到您的 WebView,您可以使用 CookieManager类(CookieManager.setCookie 设置 cookie 的方法)。

这是一个在 WebView 中设置 cookie(名为 ci_session )并为每个请求设置自定义 header (名为 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;
            },
          ))
        ])),
      ),
    );
  }
}

关于android - Flutter webview 拦截所有请求并添加 headers,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61482001/

相关文章:

html - 将本地 css 文件加载到 webview 中

webview中的iOS静态图片加载

android - 按下后退按钮时关闭弹出窗口

android - build.gradle:有条件地在产品变体中包含功能

java - 对象池概念在android中的实现

android - Flutter - 在一个屏幕上显示两个 ListView

android - 在firebase,flutter中应该如何处理好友请求和邀请?

bash - WSL 和 bash 命令

flutter - myfatoorah_flutter 导入包构建失败

java - 显示/隐藏网页 View 问题