跨平台应用开发进阶(五十七):uni-app 通过 overrideUrlLoading 实现拦截 webview 窗口的 URL 跳转请求

一、前言

项目需求 :通过uni-appwebview嵌入H5页面,且webviewsrc为互联网页面访问地址,页面中涉及很多可点击链接,若不加限制,则可以在webview中随意跳转至其它外链地址,存在安全合规隐患。

可通过overrideUrlLoading实现拦截Webview窗口的URL请求。

二、overrideUrlLoading

语法如下:

javascript 复制代码
void wobj.overrideUrlLoading(options, callback);

说明:

  • 拦截URL请求后,Webview窗口将不会跳转到新的URL地址,此时将通过callback回调方法返回拦截的URL地址(可新开Webview窗口加载URL页面等)。
  • 此方法只能拦截窗口的网络超链接跳转(包括调用loadURL方法触发的跳转),不可拦截页面请求资源请求(如加载css/js/png等资源的请求)。
  • 多次调用overrideUrlLoading时仅以最后一次调用设置的参数值生效。

参数

  • options: ( WebviewOverrideUrlOptions ) 可选 拦截URL请求的参数。

  • effect:(String 类型 ) 拦截URL请求生效时机。 可取值:

  • "instant" -表示立即生效,即调用overrideUrlLoading方法后立即生效;

  • "touchstart" -表示用户操作Webview窗口(触发touchstart事件)后生效,如果用户没有操作Webview窗口则不对URL请求操作进行拦截处理。

默认值为"instant"。

  • mode: (String 类型 ) 拦截模式。可取值: "allow"、"reject",默认值为"reject"。

    • "allow"表示满足match属性定义的条件时不拦截url继续加载,不满足match属性定义的条件时拦截url跳转并触发callback回调;
    • "reject"表示满足match属性定义的提交时拦截url跳转并触发callback回调,不满足match属性定义的条件时不拦截url继续加载。
  • match: (String 类型 ) 区配是否需要处理的URL请求。支持正则表达式,默认值为对所有URL地址生效(相当于正则表达式".*")。如果mode值为"allow"则允许区配的URL请求跳转,mode值为"reject"则拦截区配的URL请求。

  • exclude: (String 类型 ) 排除拦截处理请求类型。不拦截处理指定类型的URL请求,直接使用系统默认处理逻辑。 可取值:

    • "none"表示不排除任何URL请求(即拦截处理所有URL请求);
    • "redirect"表示排除拦截处理301/302跳转的请求(谨慎使用,非a标签的href触发的URL请求可能会误判断为302跳转)。 默认值为"none"。
  • callback: ( OverrideUrlLoadingCallback ) 可选 拦截URL请求的回调函数。

参数: event: ( Event ) 必选 Webview窗口拦截URL跳转事件数据; 可通过eventurl属性获取拦截的URL地址。

返回值void : 无

平台支持

  • Android - ALL (支持) :
  • 5+APP需要选择"解压资源后运行"模式后才能截获应用资源的URL请求。
  • iOS - ALL (支持)

二、码上解决

javascript 复制代码
onReady() {
	var that = this;
	// #ifdef APP-PLUS
	var pages = getCurrentPages();
	var page = pages[pages.length - 1];
	var currentWebview = page.$getAppWebview();
	// 或者通过以下方式获得:const currentWebview = this.$mp.page.$getAppWebview(); 
	var url = currentWebview.children()[0].getURL();
	// 延时是为了正确获取到 child 也就是打开外链地址的web-view对象,overrideUrlLoading阻止外层对象没有用
	setTimeout(()=>{
		var wv = currentWebview.children()[0];
		// 拦截所有页面的跳转,可使用参数拦截  .jd.com
		wv.overrideUrlLoading({
        // "reject"  表示满足match属性定义的提交时拦截url跳转并触发callback回调,不满足match属性定义的条件时不拦截url继续加载。
        // "allow"  表示满足match属性定义的条件时不拦截url继续加载,不满足match属性定义的条件时拦截url跳转并触发callback回调;
			mode: 'allow',
			match: '.*jd\.com/.*'
		}, function(e) {
			try {
				// 根据自己的业务需求,处理链接上的参数,进行跳转
				var navURL =`/pages/index/order/order?id=${xxx}`;
				uni.navigateTo({
					url: navURL,
					animationType: 'pop-in'
				})
			} catch (e) {
				console.log(e)
				//TODO handle the exception
			}
			console.log('reject Url', url);
		})
	}, 500);
	// #endif
},

以上根据自身业务需求进行,可以完成H5页内webview请求拦截。

三、拓展阅读

相关推荐
Jagger_8 分钟前
Cursor + Apifox MCP:告别手动复制接口,AI 助你高效完成接口文档开发
前端
IT_陈寒24 分钟前
Redis性能优化:5个被低估的配置项让你的QPS提升50%
前端·人工智能·后端
Hilaku31 分钟前
重新思考CSS Reset:normalize.css vs reset.css vs remedy.css,在2025年该如何选?
前端·css·代码规范
袁煦丞44 分钟前
一图看懂Docker管理 Portainer:cpoar内网穿透实验室第652个成功挑战
前端·程序员·远程工作
右子1 小时前
微信小程序开发“闭坑”指南
前端·javascript·微信小程序
入秋1 小时前
Three.js后期处理实战:噪点 景深 以及色彩调整
前端·javascript·three.js
Asort1 小时前
JavaScript设计模式(七)——桥接模式:解耦抽象与实现的优雅之道
前端·javascript·设计模式
golang学习记1 小时前
从0死磕全栈之Next.js 应用中的认证与授权:从零实现安全用户系统
前端
苏打水com2 小时前
携程前端业务:在线旅游生态下的「复杂行程交互」与「高并发预订」实践
前端·状态模式·旅游
Darenm1112 小时前
深入理解CSS BFC:块级格式化上下文
前端·css