鸿蒙webview开发中web内部网络请求访问资源跨域问题,客户端解决方案

鸿蒙webview开发中web内部网络请求访问资源跨域问题,客户端解决方案

项目场景:

在鸿蒙系统的h5混合开发过程中,我们使用web组件进行混合开发,后台并未对跨域问题进行处理,web组件内部发送网络请求出现访问资源跨域问题。


问题描述

访问资源跨域是浏览器在发送网络请求时经常遇到的问题,而鸿蒙的web组件也就相当于一个浏览器,因此在web组件内部发送,也会出现跨域问题,这种问题一般需要再后台解决,但是鸿蒙官方也有提供客户端解决跨域的方案,官网:解决Web组件本地资源跨域问题-管理Web组件的网络安全与隐私-ArkWeb(方舟Web)-应用框架 - 华为HarmonyOS开发者


原因分析:

为了提高安全性,ArkWeb内核不允许file协议或者resource协议访问URL上下文中来自跨域的请求。因此,在使用Web组件加载本地离线资源的时候,Web组件会拦截file协议和resource协议的跨域访问。可以通过方法二设置一个路径列表,再使用file协议访问该路径列表中的资源,允许跨域访问本地文件。当Web组件无法访问本地跨域资源时,开发者可以在DevTools控制台中看到类似以下报错信息:

官方解决方案描述:

在鸿蒙官网,提供了两种解决方案:

一、为了使Web组件能够成功访问跨域资源,开发者应采用http或https等协议,替代原先使用的file或resource协议进行加载。其中,替代的url域名为自定义构造的仅供个人或者组织使用的域名,以避免与互联网上实际存在的域名产生冲突。同时,开发者需利用Web组件的onInterceptRequest方法,对本地资源进行拦截和相应的替换。

二、

通过设置设置一个路径列表。当使用file协议访问该列表中的资源时,允许进行跨域访问本地文件。此外,一旦设置了路径列表,file协议将仅限于访问列表内的资源(此时,fileAccess的行为将会被此接口行为覆盖)。路径列表中的路径必须符合以下任一路径格式:

1.应用文件目录通过Context.filesDir获取,其子目录示例如下:/data/storage/el2/base/files/example/data/storage/el2/base/haps/entry/files/example

2.应用资源目录通过Context.resourceDir获取,其子目录示例如下:/data/storage/el1/bundle/entry/resource/resfile/data/storage/el1/bundle/entry/resource/resfile/example

当路径列表中的任一路径不满足上述条件时,系统将抛出异常码401,并判定路径列表设置失败。若设置的路径列表为空,file协议的可访问范围将遵循fileAccess的规则。

解决方案:

由于本人在开发过程中使用到了第二种解决方案, 在这里本人提供具体的操作步骤,以及指出本人踩过的坑点。

在web组件上本使用的是  resource:// 协议去访问资源,使用如下 X:

 Web({ src: 'resource://rawfile/dist/index.html#/xxxx', controller: this.webController })

然而setPathAllowingUniversalAccess 属性需要读取的是/data/storage/el1/bundle/entry/resource/resfile目录下的文件,使用Context.resourceDir获取到的路径为空

原来是在项目创建时并不会自动生成resfile文件,需要我们手动创建,在项目的src/main/resources下新建文件夹:resfile

将打包好的dist文件,也就是h5页面文件,放在resfile文件夹下面,通过以下方法读取文件   

web({ src:'resource://resfile/dist/index.html#/xxxxxxx', controller: this.webController })

 做好以上步骤之后,就来到了解决跨域最为关键的点:

设置setPathAllowingUniversalAccess,这里需要指定解除跨域的文件

 // 在设置好setPathAllowingUniversalAccess 之后,需要将src置空,使用loadUrl加载页面 Web({ src: "", controller: this.webController }) .onControllerAttached(() => { try { // 设置允许可以跨域访问的路径列表 this.webController.setPathAllowingUniversalAccess([ // 这里获取到resfile文件目录,后边拼上自己的h5文件 getContext().resourceDir + "/dist/index.html" ]) this.webController.loadUrl('原页面路径') } catch (error) { console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); } }) .javaScriptAccess(true) .fileAccess(true) .domStorageAccess(true)

 至此即成功使用官方的第二种方法去在客户端解决咱们在鸿蒙+h5的混合开发中的h5页面跨域问题了

Read more

【Java Web学习 | 第1篇】前端 - HTML

【Java Web学习 | 第1篇】前端 - HTML

文章目录 * Java Web概览 * HTML核心知识点总结 * 一、HTML基础概念🥝 * 1.1 HTML文档基本结构 * 1.2 HTML标签特点 * 二、常用HTML标签🧾 * 2.1 文本标签 * 2.2 链接与图像 * 综合示例 * 2.3 列表标签 * 2.4 表格标签 * 2.5 表单标签 * 三、HTML5新增特性🤔 * 3.1 语义化标签 * 3.2 媒体标签 * 3.3 其他新增特性 * 四、学习资源推荐🐦‍🔥 Java Web概览 HTML核心知识点总结 一、HTML基础概念🥝 1.1

STEP3-VL-10B部署案例:ZEEKLOG算力平台Supervisor自动管理webui服务,3步启用图文对话

STEP3-VL-10B部署案例:ZEEKLOG算力平台Supervisor自动管理webui服务,3步启用图文对话 你是不是也遇到过这种情况:好不容易找到一个强大的多模态AI模型,想部署到服务器上试试,结果被各种环境配置、服务管理搞得头大?启动脚本写错一个参数,服务就挂了;服务器重启后,还得手动去启动服务;想换个端口,又得改一堆配置文件。 今天我要分享一个特别省心的部署方案——在ZEEKLOG算力平台上部署STEP3-VL-10B多模态模型,用Supervisor实现服务自动管理。你只需要3步,就能拥有一个稳定运行的图文对话服务,再也不用担心服务意外停止的问题了。 1. 为什么选择STEP3-VL-10B? 先简单介绍一下这个模型。STEP3-VL-10B是阶跃星辰开源的一个10B参数的多模态视觉语言模型,别看它参数不算特别大,能力却相当强悍。 1.1 模型能力亮点 我测试过不少多模态模型,STEP3-VL-10B有几个地方让我印象深刻: 第一是推理能力强。它在MMMU(多学科多模态理解)基准测试上拿到了78.11分,这个测试涵盖了科学、技术、工程、数学等多个学科,能

前端Canvas:让你的网站更具视觉冲击力

前端Canvas:让你的网站更具视觉冲击力 毒舌时刻 前端Canvas?这不是游戏开发才用的吗? "Canvas性能差,我不用"——结果错过了丰富的视觉效果, "Canvas太复杂了,我学不会"——结果只能用静态图片, "我用CSS就够了,要Canvas干嘛"——结果无法实现复杂的动画效果。 醒醒吧,Canvas不是游戏开发的专利,前端也可以用它来创建丰富的视觉效果! 为什么你需要这个? * 丰富的视觉效果:创建动态图形、动画和游戏 * 高性能:直接操作像素,性能优异 * 交互性:支持鼠标、触摸等交互 * 数据可视化:绘制图表、仪表盘等 * 跨平台:在所有现代浏览器中运行 反面教材 // 反面教材:简单的Canvas绘制 function drawCircle() { const canvas = document.getElementById('canvas'

前端请求后端返回404/405/500状态码:完整排查与解决指南

前端请求后端返回404/405/500状态码:完整排查与解决指南

前端发起HTTP请求时,浏览器Network面板频繁出现404、405、500等状态码,是前后端交互中最常见的接口异常。这些状态码并非前端代码语法错误,而是HTTP协议层面的响应状态提示——404代表资源未找到,405代表请求方法不被允许,500代表服务器内部错误,三类错误的排查方向截然不同:404侧重「资源路径匹配」,405侧重「请求方法与跨域配置」,500侧重「后端代码与服务器环境」。本文将从每个状态码的核心本质出发,分场景梳理高频诱因与解决方案,覆盖前端配置、后端接口、服务器环境、代理转发等全链路,提供可直接落地的排查步骤和代码示例,帮助开发者快速定位并解决问题。 文章目录 * 一、核心认知:三类状态码的本质与快速区分 * 1.1 状态码核心定义与本质 * 1.2 快速区分:通过Network面板定位状态码类型 * 1.3 关键前提:明确“请求是否到达后端” * 二、场景1:404 Not Found(资源未找到)—— 排查与解决方案 * 2.1