当前位置: 首页 > news >正文

关于Android webview协议混淆

背景:android中引入的html页面是http请求(web服务仅开放了80端口),但html页面引用的后端接口是https请求,则发生android中html页面请求接口异常<请求无法发送到后端服务(status=0)>。

浏览器出于安全考虑,要求: 同源策略(Same-Origin Policy, SOP)

  • 协议(Protocol):如 http 或 https
  • 域名(Host):如 www.example.com
  • 端口(Port):如 80(HTTP 默认)、443(HTTPS 默认)或自定义端口如 8080

只有当 协议、域名、端口 三者完全一致时,才被认为是同源,否则就是跨域

Android WebView(基于 Chromium 内核)遵循浏览器安全策略:

  • HTTPS 页面 → 调用 HTTP 接口 = 不安全,通常直接被拦截。

  • HTTP 页面 → 调用 HTTPS 接口 = 视为 跨域 + mixed content,也可能被拦截,尤其在高版本 Android。


✅ 解决方案

方案 1:让 HTML 页面也用 HTTPS (推荐)

  • 最干净的解决方案就是把 HTML 页面本身部署在 HTTPS 上。

  • 这样整个页面和接口都在 HTTPS 下,就不会触发浏览器/内核的 mixed content 限制。


方案 2:WebView 设置允许混合内容

如果后端暂时不能改,可以在 Android WebView 里允许 Mixed Content。

WebSettings webSettings = webView.getSettings(); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { // MIXED_CONTENT_ALWAYS_ALLOW:允许 http 和 https 混用 webSettings.setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW); }

  • ⚠️ 缺点:降低安全性(可能被劫持 http 请求)。

  • 一般仅用于过渡方案。


方案 3:反向代理(推荐给你当前情况)

  • HTTP 页面请求HTTPS 接口 统一到同一个协议。

  • 比如在 Nginx 配置里:

    • 页面继续用 http://cloud.amardata.com/...

    • 接口请求 http://cloud.amardata.com/api/...

    • 然后由 Nginx 反向代理转发到后端 https://cloud.amardata.com/api/...

这样页面和接口都是 http://,浏览器不会阻止,但对后端仍然是安全的 https://


方案 4:通过 Android 端代理接口

如果 HTML 不能改,可以让 Android 端 拦截 WebView 的接口请求,转为 App 内部请求,再把结果注入页面。

  • WebViewClient.shouldInterceptRequest() 来拦截请求。

  • 自己用 OkHttp/HttpURLConnection 发起请求,返回给 WebView。


📝 总结

你遇到的问题就是 混合内容被 Android WebView 拦截

  • ✅ 最推荐:页面和接口都改成 HTTPS

  • ⚠️ 临时方案:setMixedContentMode(MIXED_CONTENT_ALWAYS_ALLOW)

  • 🚀 企业常用:用 Nginx 反向代理,让页面和接口保持同协议

http://www.dtcms.com/a/338621.html

相关文章:

  • v-model 入门教程
  • 构建现代化的Web UI自动化测试框架:从图片上传测试实践说起
  • 【网络运维】Ansible roles:角色管理
  • 前端多环境变量配置全攻略:开发 / 测试 / 生产自动切换实战
  • 时间差值工具Date.now()和performance.now()
  • 【实时Linux实战系列】实时大数据处理与分析
  • 【STM32】HAL库中的实现(五):ADC (模数转换)
  • 服务器经常宕机的原因及解决办法
  • Xftp8传输文件与 Linux 系统 Anaconda 安装
  • 腾讯混元3D系列开源模型:从工业级到移动端的本地部署
  • 游戏相机震动与武器后坐力实现指南
  • 禾赛激光雷达AT128P/海康相机(2):基于欧几里德聚类的激光雷达障碍物检测
  • VScode ROS文件相关配置
  • 知识篇 | 中间件会话保持和会话共享有啥区别?
  • 在Windows高效使用OpenCode的方案
  • Rust 入门 返回值和错误处理 (二十)
  • Docker 快速下载Neo4j 方法记录
  • 管道魔法再现:卡巴斯基发现与CVE-2025-29824漏洞利用相关的进化版后门程序
  • Rust学习笔记(七)|错误处理
  • 人工智能驱动的开发变革
  • 安全多方计算(MPC)技术解析及NssMPClib开源项目实践
  • 驱动开发系列65 - NVIDIA 开源GPU驱动open-gpu-kernel-modules 目录结构
  • ubuntu24 编译安装php-7.4.33
  • Python入门第11课:Python网络请求入门,使用requests库轻松获取网页数据
  • 什么是大数据平台?大数据平台和数据中台有什么关系?
  • RNN如何将文本压缩为256维向量
  • ubuntu下编译c程序报错“ubuntu error: unknown type name ‘uint16_t’”
  • 【保姆级教程~】如何在Ubuntu中装miniconda,并创建conda虚拟环境
  • ubuntu20.04 上 flathub summary exceeded maximum size of 10485760 bytes 的处理
  • 边缘智能体:Go编译在医疗IoT设备端运行轻量AI模型(上)