解决android native包webview,webview中的请求blocked by CORS policy
在stack overflow查,差不多查到的都是些webView.getSettings().setxxx,没用。在github上找别的类似的android native包webview运行pwa的项目,把它们的webView.getSettings().setxxx全搬过来,写了有一页多,一个有用的都没有,他们开发没有遇到过同源限制嘛!!!
还有一种,配置安卓项目本身的network,就是写一个network_security_config.xml,把服务器地址放到subdomain里。这个听了不大靠谱,因为同源策略是浏览器的限制,换言之,是webview的限制,应该要配置webview相关的,而不是app相关
查到的另外一种较多的方法是override shouldInterceptRequest,意思就是拦截request,然后进行一些这样那样的操作,帮助服务端返回数据,这个是最靠谱的。把他们的代码统统搬过来一个一个试了,都用不了,看来得自己写了
其实关于shouldInterceptRequest,官方文档是有example的,不过看起来虽然写了什么with same-origin policy,它主要的意思是同“协议”的源。同源策略不是说协议,域名,端口一致嘛,这些本地文件本来是file://,协议不一样,获取不到的,它通过assetLoader转一下,把file://xxx.js转成https://appassets.androidplatform.net/xxx.js,这样协议就都是https了,就能获取到并加载到webview中了:
https://developer.android.com/develop/ui/views/layout/webapps/load-local-content#assetloader
让server那边加Access-Control-Allow-Origin响应头,不现实,我们只是做poc,让人家好好的服务端改数据,怎么可能,人家能理咱?
之前我用react native开发过一版,也是跑在android tv上的,用的同一套restapi,为啥当时非常没遇到这些问题啊
搜了一下官方文档,好家伙,XMLHttpRequest是不存在CORS问题的:
https://reactnative.dev/docs/network#using-other-networking-libraries
好嘛,那要是这样说的话,直接拦截url,然后用XMLHttpRequest去请求,然后把响应返回回去,不就好了(智将
结果在那边满头大汗弄了半天,好不容易XMLHttpRequest转过去了,但怎么也没把XMLHttpResponse转成shouldInterceptRequest需要返回的WebResourceResponse,本来就不会kotlin,全组就我一个人弄这个,硬着头皮嗯写,写的烦死了
突然灵机一动,既然转的太麻烦,干脆不转了,同源策略限制是吧,我自己安一个响应头上去!
private class LocalContentWebViewClient(private val assetLoader: WebViewAssetLoader) :WebViewClientCompat() {val INTERCEPT_KEY_LOCAL_ASSET = "https://appassets.androidplatform.net/"val client = OkHttpClient()var headers: MutableMap<String, String> = java.util.HashMap()init {headers["Access-Control-Allow-Origin"] = "*"headers["Access-Control-Allow-Headers"] ="隐去,按照您的实际请求的headers来写"}fun requestDataFromServer(request: WebResourceRequest): ResponseBody? {val url = request.url.toString()var responseBody: ResponseBody? = null;try {val req = Request.Builder().url(url).headers(request.requestHeaders.toHeaders()).build()val call = client.newCall(req)val resp = call.execute()responseBody = resp.body} catch (e: Exception) {println("url failed" + url + e.toString());}return responseBody}override fun shouldInterceptRequest(view: WebView,request: WebResourceRequest): WebResourceResponse? {val url = request.url.toString()return if (url.contains(INTERCEPT_KEY_LOCAL_ASSET)) {assetLoader.shouldInterceptRequest(request.url)} else if (url.contains(".jpeg")) {val responseBody = requestDataFromServer(request)val data: InputStream? = responseBody?.byteStream()return WebResourceResponse("image/jpeg","UTF-8",200,"OK",headers,data)} else if (url.contains(".png")) {val responseBody = requestDataFromServer(request)val data: InputStream? = responseBody?.byteStream()return WebResourceResponse("image/png","UTF-8",200,"OK",headers,data)} else {val responseBody = requestDataFromServer(request)val data: InputStream? = responseBody?.byteStream()return WebResourceResponse("application/json","UTF-8",200,"OK",headers,data)}}}
代码就贴在这里了,供各位同样受困于这个问题的朋友们参考,第一个url.contains(INTERCEPT_KEY_LOCAL_ASSET),就是本地的html css js文件,按照android developer官方写法就好;其他的三种是一个意思,在外面用okhttp库获取response,安上跨域的header,把response body塞到里面stream里面返回,唯一的不同就是MIME type的不同,图片格式不能用"application/json",要分开
当然如果优化的还有很大的优化空间,比方说okhttp请求用异步的写法更好,还有直接把status code设置为200,肯定是不对的,我只是一个做poc的,懒得改了,验证完可行性给领导展示了就完了,相信server端同事们的水平(x) 大家如果参考记得改改嗷
相关文章:
解决android native包webview,webview中的请求blocked by CORS policy
在stack overflow查,差不多查到的都是些webView.getSettings().setxxx,没用。在github上找别的类似的android native包webview运行pwa的项目,把它们的webView.getSettings().setxxx全搬过来,写了有一页多,一个有用的都…...
链篦机回转窑球团生产工艺
生球在回转窑氧化焙烧,回转窑头部设有燃烧器,燃料可以采用气体、固体、液体。 来自环冷机一冷却段的高温废气作为二次风进入窑内参与燃烧,烧成成品球进入环冷机。 环冷机采用鼓风冷却,热风风箱分为四段: 一段气体引至…...
查看电脑ip地址快捷键是什么?是哪个
在网络世界中,IP地址是每个网络设备的唯一标识,无论是我们的电脑、手机还是其他联网设备,都需要一个独特的IP地址来进行通讯。在日常生活和工作中,我们有时需要查看电脑的IP地址,以便进行网络设置、故障排查或远程连接…...
面试专区|【54道Spring Cloud高频题整理(附答案背诵版)】
什么是Spring Cloud? Spring Cloud是一个基于Spring Boot的开源框架,它提供了在分布式系统中集成各种服务治理功能的工具,如配置管理、服务发现、断路器、智能路由、微代理、控制总线、全局锁、决策竞选、分布式会话和集群状态等。其主要目…...
Shopee(虾皮)怎么获取流量?
店铺流量的高低会直接关联到卖家店铺单量,也关系到一个店铺的营业情况和利润,那么Shopee的流量从哪里来呢? Shopee的平台流量可分为五个部分: 1.自然流量 2.关键字广告流量 3.平台活动流量 4.营销流量 5.粉丝流量 怎么提升…...
Java启动虚拟机默认字符集编码
-Dfile.encodingUTF-8 java程序启动默认字符集编码参数 // 这里会创建一个Charset.defaultCharset().name()的流,在Windows命令行窗口启动,会出现字符编码为GBK的情况 // 导致乱码输入、输出都会有影响 // 解决办法流的读取指定编码new InputStreamRead…...
【单片机编程模式】状态机编程
状态机编程是一种编程模式,它基于有限状态机(Finite State Machine,简称FSM)的概念。以下是状态机编程的清晰解释,分点表示和归纳: 基本概念: 状态机是一个有向图形,由一组节点&…...
IPSS模块怎么安装到VOS服务器的,到底有没有效果,是不是能大幅度提升VOS3000安全性呢
由于VOS的普及性,不得不承认VOS确实是非常优秀的软交换,但是很多客户在使用过程中都会遇到各种安全问题,比如话费被盗用了,历史话单一堆的非法呼叫话单,严重的影响到了话务安全,并不是那点话费的事了&#…...
C++ STL容器:序列式容器-堆pirority_queue
摘要: CC STL(Standard Template Library,标准模板库)在C编程中的重要性不容忽视,STL提供了一系列容器、迭代器、算法和函数对象,这些组件极大地提高了C程序的开发效率和代码质量。 STL 容器 分为 2 大类 …...
ECharts在最新版本中使用getInstanceByDom报错处理
引用问题导致报错 如果按如下引用的话,会报错 import echarts from “echarts/lib/echarts”; 原因 在 ECharts 的之前版本中,默认导出了一个名为 echarts 的对象,所以使用 import echarts from “echarts” 是没有问题的。但是在 ECharts …...
利用C语言实现三子棋游戏
文章目录 1.游戏界面2.游戏内容2.1 棋盘类型2.2棋盘的初始化2.3 打印棋盘的界面展示 3.游戏操作3.1 玩家操作3.2 电脑操作3.3 胜负判定 4.代码整合 1.游戏界面 无论写任何程序,我们都需要先去了解它的大概框架,这里我们先把它的初始界面写出来。一个游戏…...
大学教师门诊预约小程序-计算机毕业设计源码73068
摘要 在当今数字化、信息化的浪潮中,大学校园的服务管理正朝着智能化、便捷化的方向迈进。为了优化大学教师的医疗体验,提升门诊预约的效率和便捷性,我们基于Spring Boot框架设计并实现了一款大学教师门诊预约小程序。该小程序不仅提供了传统…...
Python PyCryptodome库介绍与实例
Python PyCryptodome库介绍与实例 1. 安装2. 基本概念3. 使用场景和示例代码3.1 对称加密 - AES3.2 非对称加密 - RSA3.3 哈希函数 - SHA2563.4 消息认证码 - HMAC 4. 总结 PyCryptodome是一个强大的Python加密库,提供了各种加密算法和工具。本文将介绍PyCryptodome的基本概念和…...
《框架封装者 · 自定义初始化事件》
📢 大家好,我是 【战神刘玉栋】,有10多年的研发经验,致力于前后端技术栈的知识沉淀和传播。 💗 🌻 CSDN入驻不久,希望大家多多支持,后续会继续提升文章质量,绝不滥竽充数…...
ActiViz实战:使用vtkImageClip和vtkImageActor根据滑动条来显示当前图像数据切面
文章目录 一、效果预览二、代码实现三、源码地址一、效果预览 ActiViz实现图像数据切面显示 二、代码实现 public partial class Form1 : Form {private vtkRenderWindowInteractor _interactor;private vtkRenderer _renderer...
【论文笔记】BEVCar: Camera-Radar Fusion for BEV Map and Object Segmentation
原文链接:https://arxiv.org/abs/2403.11761 0. 概述 本文的BEVCar模型是基于环视图像和雷达融合的BEV目标检测和地图分割模型,如图所示。模型的图像分支利用可变形注意力,将图像特征提升到BEV空间中,其中雷达数据用于初始化查询…...
圆通寄15kg30kg一般多少钱?寄大件物品怎么寄最便宜?
作为一名即将毕业的大学生,搬家成了我和室友们共同的难题。尤其是在寄送大件物品时,如何省钱、如何打包、选择哪家快递公司等问题让我们头疼不已。今天,我就来分享一些寄大件物品的省钱技巧以及打包方法,希望对大家有所帮助。 一…...
transformer初探
transformer初探 self-attentionmultihead-attentionencoderdecoder self-attention 其实就是三个矩阵, W q W_q Wq、 W k W_k Wk、 W v W_v Wv,这三个矩阵就是需要训练的参数。分别得到每个token对应的 q q q k k k v v v,其中 q …...
JUC并发编程基础(包含线程概念,状态等具体实现)
一.JUC并发编程基础 1. 并行与并发 1.1 并发: 是在同一实体上的多个事件是在一台处理器上"同时处理多个任务"同一时刻,其实是只有一个事件在发生. 即多个线程抢占同一个资源. 1.2 并行 是在不同实体上的多个事件是在多台处理器上同时处理多个任务同一时刻,大家…...
集中管理和分析日志:使用 ELK 套件构建强大的日志管理平台
集中管理和分析日志:使用 ELK 套件构建强大的日志管理平台 日志是监控和调试应用程序和系统的重要工具。集中管理和分析日志可以帮助你快速定位问题、了解系统运行状况和性能,并提高你的日志管理效率。ELK 是一个流行的日志管理解决方案,由 …...
从WWDC看苹果产品发展的规律
WWDC 是苹果公司一年一度面向全球开发者的盛会,其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具,对过去十年 WWDC 主题演讲内容进行了系统化分析,形成了这份…...
Java 8 Stream API 入门到实践详解
一、告别 for 循环! 传统痛点: Java 8 之前,集合操作离不开冗长的 for 循环和匿名类。例如,过滤列表中的偶数: List<Integer> list Arrays.asList(1, 2, 3, 4, 5); List<Integer> evens new ArrayList…...
python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)
更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...
HTML前端开发:JavaScript 常用事件详解
作为前端开发的核心,JavaScript 事件是用户与网页交互的基础。以下是常见事件的详细说明和用法示例: 1. onclick - 点击事件 当元素被单击时触发(左键点击) button.onclick function() {alert("按钮被点击了!&…...
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南 在数字化营销时代,邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天,我们将深入解析邮件打开率、网站可用性、页面参与时…...
OPENCV形态学基础之二腐蚀
一.腐蚀的原理 (图1) 数学表达式:dst(x,y) erode(src(x,y)) min(x,y)src(xx,yy) 腐蚀也是图像形态学的基本功能之一,腐蚀跟膨胀属于反向操作,膨胀是把图像图像变大,而腐蚀就是把图像变小。腐蚀后的图像变小变暗淡。 腐蚀…...
USB Over IP专用硬件的5个特点
USB over IP技术通过将USB协议数据封装在标准TCP/IP网络数据包中,从根本上改变了USB连接。这允许客户端通过局域网或广域网远程访问和控制物理连接到服务器的USB设备(如专用硬件设备),从而消除了直接物理连接的需要。USB over IP的…...
sipsak:SIP瑞士军刀!全参数详细教程!Kali Linux教程!
简介 sipsak 是一个面向会话初始协议 (SIP) 应用程序开发人员和管理员的小型命令行工具。它可以用于对 SIP 应用程序和设备进行一些简单的测试。 sipsak 是一款 SIP 压力和诊断实用程序。它通过 sip-uri 向服务器发送 SIP 请求,并检查收到的响应。它以以下模式之一…...
Spring是如何解决Bean的循环依赖:三级缓存机制
1、什么是 Bean 的循环依赖 在 Spring框架中,Bean 的循环依赖是指多个 Bean 之间互相持有对方引用,形成闭环依赖关系的现象。 多个 Bean 的依赖关系构成环形链路,例如: 双向依赖:Bean A 依赖 Bean B,同时 Bean B 也依赖 Bean A(A↔B)。链条循环: Bean A → Bean…...
回溯算法学习
一、电话号码的字母组合 import java.util.ArrayList; import java.util.List;import javax.management.loading.PrivateClassLoader;public class letterCombinations {private static final String[] KEYPAD {"", //0"", //1"abc", //2"…...
