Flutter webview拦截所有请求并添加headers
Flutter webview intercept and add headers to all requests
使用 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
,但它只有 returns 一个 NavigationDecision
,这对我来说没有用。
你可以使用我的插件 flutter_inappwebview,这是一个 Flutter 插件,允许你添加内联 WebViews 或打开一个 in-app 浏览器 window 并且有很多事件,方法,以及控制 WebView 的选项。
如果您需要为每个请求添加自定义 headers,您可以使用 shouldOverrideUrlLoading
事件(您需要使用 useShouldOverrideUrlLoading: true
选项启用它)。
相反,如果您需要将 cookie 添加到您的 WebView,您可以只使用 CookieManager
class(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;
},
))
])),
),
);
}
}
在 flutter_webview 案例中
onWebViewCreated: (WebViewController webViewController) {
this.webViewController = webViewController;
},
onPageStarted: (url) {
webViewController.loadUrl(url, headers: headers);
},
使用这个
使用 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
,但它只有 returns 一个 NavigationDecision
,这对我来说没有用。
你可以使用我的插件 flutter_inappwebview,这是一个 Flutter 插件,允许你添加内联 WebViews 或打开一个 in-app 浏览器 window 并且有很多事件,方法,以及控制 WebView 的选项。
如果您需要为每个请求添加自定义 headers,您可以使用 shouldOverrideUrlLoading
事件(您需要使用 useShouldOverrideUrlLoading: true
选项启用它)。
相反,如果您需要将 cookie 添加到您的 WebView,您可以只使用 CookieManager
class(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;
},
))
])),
),
);
}
}
在 flutter_webview 案例中
onWebViewCreated: (WebViewController webViewController) {
this.webViewController = webViewController;
},
onPageStarted: (url) {
webViewController.loadUrl(url, headers: headers);
},
使用这个