【Flutter和H5数据传递问题】window.postMessage方法引起的数据问题

Flutter

  • 前言
  • 问题
    • 双引号问题
    • 请求数据问题
  • 总结

前言

距离上一篇博客已经过了很长时间了,这次在做公司项目中又遇到了新的问题,决定还是写出来看看各位大神对此有什么看法,分享一下各位的想法。

问题

首先,公司项目的框架是由Flutter去编写的,最初的框架是由uniapp框架来做的,但是uniapp在客户端的性能懂得都懂。。。这里就不过多赘述,所以呢,是从uniapp框架迁移到flutter,但是由于项目周期的原因,最终采取的方式是flutter中混入uniapp,也就是让uniapp以H5的形式混入到flutter代码中,相当于在flutter中打开一个webview,那么就一定会涉及到通信问题

那么客户端和h5通信有哪些方式呢?

  • nativeApi
  • window.postMessage
  • localStrorage

nativeApi:其实就是客户端写一个函数,然后放在全局环境中,让环境中的h5去调用函数,以此来沟通
window.postMessage:这种方式比较常用于客户端向h5端传递数据,然后h5在页面中进行监听,以此获取数据

实际在开发中,方法都是混合使用的,比如我客户端传递数据使用postMessage给h5,h5通过客户端提前在当前环境注入的方法去调用native方法传递数据回给客户端,这种方式都一定是异步的,实际上flutter跟原生层也是异步的,异步肯定就会有延迟。

回到今天的重点问题,就是数据格式的问题,一般来说,客户端传递给h5数据,都会经过jsonEncode一次变成String类型的数据,然后再到h5层进行jsonDecode

实际代码大致如下:

客户端层:

 String data = jsonEncode(result);await _controller.evaluateJavascript(source: "window.postMessage({data:'$data'},'*')");

h5层:

 window.addEventListener('message', (event) => {event.data
})

当然,实际上还会更复杂一些,会有一些通信规范和作用范围。

问题是什么呢如果这个数据中存在双引号会怎么样?

双引号问题

可能觉得这种东西没有什么问题,我也大意了没有闪,正常json数据格式大家都很清楚,问题是如果你的数据是用户可以自由输入的,那就涉及格式过滤的问题,比如各种特殊的符号,换行符、制表符等等,这种东西在编码的时候可能没问题,因为但凡能存入数据库的都是处理了的,进行编码都会添加一个反斜杠去处理。

举个例子:

//如果你的数据是这样的
//用户的数据的xxxx"
String userData = "xxxxxx""
//那么入库的时候会变成
String userData = "xxxxxx\""

这是为了正确的编码和解码,加上反斜杠到客户端解码的时候会进行转译,最终还是显示一个双引号。

所以你是一对一的,比如客户端——后端,那应该是没问题的,但是如果你的项目是这种后端——客户端——h5端,数据多传一层,可能会遇到这个问题。

当数据到flutter层,flutter有进行了一次编码,此时还是有反斜杠的,但是到h5层会被转译,到h5的时候,此时的json格式就有问题了,变成

string aa = "  " " 

双引号和双引号括起来是一段内容,但是后面又多了一个双引号,因为这个内容是用户输入的,用户当然可以随意输入。

问题代码:

  String data = jsonEncode(result);await _controller.evaluateJavascript(source: "window.postMessage({data:'$data'},'*')");

此时data里面的数据还是存在反斜杠的,但是postMessage之后,到h5层反斜杠丢了,json解析失败了。

flutter层如果内容存在反斜杠,decode会被转译,但是encode又会还原回来,这是正确的,没有任何问题。

但是如果传递数据给h5的时候,如果被丢弃掉,就会解析失败,所以我这么处理了:

 String data = jsonEncode(result);data = data.replaceAll(r'\', r'\\') //将单反斜杠替换为双反斜杠.replaceAll(RegExp(r"(?<!\\)'"), r"\'"); //将单引号替换为单引号加反斜杠

当然可能还有更好的方法,欢迎在下面留言。

这样哪怕传递过去丢了一个,还会有一个反斜杠,到h5端转译依旧可以成功转译,但是仅限于用户可以自由输入的数据

比如你如果传递数据是用户数据或者固定格式的数据,你不能这么做,这样会传递错误的数据。

请求数据问题

前面说了,如果你是类似这种混合开发的项目,那么肯定也会有请求数据的问题,当然我们的请求往往也涉及加解密,那么这个请求究竟是放到客户端来做还是h5端来做:

  • 如果是放到客户端来做:

就是h5发起请求通知客户端请求数据,客户端请求数据成功之后再把数据传递回h5端,这种方式如果数据量比较大的情况,那么性能和效率也比较差,当然还涉及到请求没办法落地的情况,就是h5发起请求,但是突然页面被掐了,请求还在处理但是没办法接收,导致这个请求一直在天上飞,资源释放不了,这是很可怕的事情,意味着请求是不可控的

  • 请求放到h5端去做

那么客户端就只充当一个加解密的工具,请求可控,但是这里面又涉及异步和延迟的问题
h5端发起请求,将数据丢给客户端去加密回传给h5去请求,响应之后又丢回给客户端去解密后回传给h5,来回总共4次,数据量比较大,实际上性能和效率也会差,甚至如果其中一个环节出问题,可能连回调都没有。

所以这两种方式在数据量比较大的情况,性能都不好,但是呢还是建议在h5端去做请求,因为至少请求是可控的,那么就需要做好回调和沟通的处理。

要想兼顾性能又想兼顾开发周期,这是一件很矛盾的事情,往往都是需要舍弃的,这里就不过多赘述。

总结

千万不要相信用户的任何数据,用户数据是不可信的,一定做好校验和过滤。开发往往都是在舍弃的过程,我们都是在寻求一个平衡的方法。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/758069.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2024最新华为OD机试试题库全 -【执行时长】- C卷

1. 🌈题目详情 1.1 ⚠️题目 为了充分发挥GPU算力,需要尽可能多的将任务交给GPU执行,现在有一个任务数组,数组元素表示在这1秒内新增的任务个数且每秒都有新增任务。 假设GPU最多一次执行n个任务,一次执行耗时1秒,在保证GPU不空闲情况下,最少需要多长时间执行完成。…

Elasticsearch面试系列-01

1. 什么是 Elasticsearch? ES是一种开源、RESTful、可扩展的基于文档的搜索引擎,它构建在Lucene库上。 用户使用Kibana就可以可视化使用数据,同时Kibana也提供交互式的数据状态呈现和数据分析。 Apache Lucene搜索引擎基于JSON文档来进行搜索管理和快速搜索。 Elasticse…

图像分割在疾病诊断中的应用案例

图像分割在疾病诊断中的应用案例&#xff1a; 乳腺癌检测&#xff1a; 利用MRI图像&#xff0c;通过图像分割技术可以将乳腺组织与正常组织区分开来&#xff0c;进而检测出乳腺癌的早期迹象。 皮肤癌诊断&#xff1a; 对于皮肤镜下的图像&#xff0c;应用图像分割技术可以准确…

【双指针】算法例题

目录 二、双指针 25. 验证回文数 ① 26. 判断子序列 ① 27. 两数之和II - 输入有序数组 ② 28. 盛最多水的容器 ② 29. 三数之和 ② 二、双指针 25. 验证回文数 ① 如果在将所有大写字符转换为小写字符、并移除所有非字母数字字符之后&#xff0c;短语正着读和反着读都一…

Day60 (Golang) 单调栈 84.柱状图中最大的矩形

// 84.柱状图中最大的矩形 package mainimport "fmt"func largestRectangleArea(heights []int) int {// 初始化单调栈&#xff08;单调递减栈&#xff09;stack : []int{0}res : 0// 给原数组首位添加0// 数组头部加入0heights append([]int{0}, heights...)// 数组…

【EXPERIMENT】tmux、SCIP

【EXPERIMENT】tmux、SCIP 一、TMUX命令&#xff08;一&#xff09;会话操作&#xff08;二&#xff09;窗口操作&#xff08;三&#xff09;窗格操作 二、SCIP安装 一、TMUX命令 &#xff08;一&#xff09;会话操作 新建会话 tmux new -s name退出会话 ctrl B D查看会话…

C++_第三周做题总结_指针2

id:13 A.月份查询&#xff08;指针数组&#xff09; 题目描述 已知每个月份的英文单词如下&#xff0c;要求创建一个指针数组&#xff0c;数组中的每个指针指向一个月份的英文字符串&#xff0c;要求根据输入的月份数字输出相应的英文单词 1月 January 2月 February 3月 Marc…

行业回暖?这个行业岗位需求飙升6倍!程序员们提前恭喜了!

前言 随着今年史上最长春节假期正式收官&#xff0c;各行各业相继进入开工节奏&#xff0c;就业市场开启持续升温模式。 今年开工首周&#xff0c;人才需求增长明显&#xff0c;求职者活跃度大大增多&#xff0c;就业市场进入了繁忙有序的节奏&#xff0c;呈现出春招市场的勃…

Android获取某个app首次安装时间和更新时间

在Android中&#xff0c;可以使用PackageManager类来获取应用程序的安装时间和上次更新时间。以下是如何实现的一般步骤&#xff1a; 以微信为例&#xff1a; 获取一个PackageManager的实例。使用PackageManager的getPackageInfo方法&#xff0c;传入微信的包名&#xff08;通…

QT网络编程之获取本机网络信息

一.概述 查询一个主机的MAC地址或者IP地址是网络应用中常用到的功能&#xff0c;Qt提供了QHostInfo和QNetworkInterface 类可以用于此类信息的查询 1.QHostInfo 类&#xff08;显示和查找本地的信息&#xff09; 2.QNetworkInterface 类&#xff08;获得应用程序上所在主机的…

Linux性能测试工具整理

性能测试工具&#xff1a;Unixbench lmbench stream iozone fio netperf spec2000 spec2006 一、unixbench unixbench主要是用于系统基础性能测试&#xff0c;unixbench也包含一些非常简单的2D和3D图形测试 UnixBench一个基于系统的基准测试工具&#xff0c;不单纯是CPU 内存 …

在window命令行中,使用conda创建新的虚拟环境时出现的问题以及解决办法

一.出现的问题 C:\Users\zhu>conda create -n ML python3.8 Collecting package metadata (current_repodata.json): failedCondaHTTPError: HTTP 000 CONNECTION FAILED for url <https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/win-64/current_repodata.js…

南京大学AI考研,宣布改考408!

官网还没通知 附上南大与同层次学校近四年的分数线对比&#xff0c;整体很难 添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09; 添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09; 如果确定要冲南大的话建议提早调整自己的复习路线&…

Springboot中使用@Async注解7大失效场景及解决方案

Springboot中使用Async注解7大失效场景及解决方案 前言正文场景一&#xff1a;调用者与被调用者在同一个类中解决方案 场景二&#xff1a;配置类未启用异步支持解决方案 场景三&#xff1a;方法不是 public 的解决方案 场景四&#xff1a;线程池未正确配置解决方案 场景五&…

Combining external-latent attention for medical image segmentation

结合外部潜在注意的医学图像分割 摘要 注意机制是提高医学图像分割性能的新切入点。如何合理分配权重是注意力机制的关键,目前流行的方法包括全局压缩和使用自注意操作的非局部信息交互。然而,这些方法过于关注外部特征,缺乏对潜在特征的开发。全局压缩方法通过全局均值或…

C01 C++ Modding

Modding Programs running on a user-controlled computer are amenable to “modding” . If a piece of information, such as an integer representing health or lives, exists in RAM, one may find and edit it to their liking. Taken to the extreme, entirely new …

threejs 模型聚焦定位

需求&#xff1a;鼠标选中模型&#xff0c;然后点击定位按钮&#xff0c;将相机平移到模型跟前&#xff0c;相机视线不变 var box new THREE.Box3();//包围盒box.expandByObject(model);//model是模型var center new THREE.Vector3();box.getCenter(center);//获取中心点var …

测试人员如何进行需求分析?

在进行测试用例设计之前&#xff0c;我们通常需要对需求文档进行分析&#xff0c;甚至在需求评审阶段从测试角度给出建议。通过需求分析&#xff0c;不仅可以输出测试点&#xff0c;也可以发现需求中存在的问题。 业务角度和技术角度 测试需求的分析可以从两个不同的角度进行…

介绍5款 世界范围内比较广的 5款 mysql Database Management Tool

介绍5款 世界范围内比较广的 5款 Mysql Database Management Tool 文章目录 介绍5款 世界范围内比较广的 5款 Mysql Database Management Tool前言MySQL Workbench&#xff1a;Navicat Premium&#xff1a;DBeaver Community&#xff1a;HeidiSQL&#xff1a;SQLyog&#xff1a…

如何解决node-sass下载用的还是过期的淘宝源?

下载node-sass发现报错过期的证书 把npm的淘宝源换成最新的https://registry.npmmirror.com后发现还是指向了以前的淘宝源&#xff0c;看到一位博主说&#xff0c;单改npm源不够还要改下载node-sass的源&#xff0c;再次搜索另外一位博主提供了命令npm config ls可以使用它来查…