Flutter Web CORS解决方案1-禁用浏览器安全策略

news2024/11/28 10:45:22

Flutter Web CORS解决方案1

    • 设置CHROME_EXECUTABLE
      • 关于 CHROME_EXECUTABLE
      • 创建 CHROME_EXECUTABLE
    • 修改 chrome.dart 禁用安全策略
      • 升级 flutterSDK 后需重新修改
      • 升级后指定--web-hostname参数问题
    • 浏览器启用 Allow-CORS 插件
      • 部分协议OPTIONS预检跨域问题

本文介绍第一种解决FlutterWeb CORS问题的方案:修改Chrome浏览器安全策略或修改flutter web启动chrome代码。

设置CHROME_EXECUTABLE

  • Disable-web-security in Chrome 48+
  • Run Chrome browser without CORS
  • Chrome关闭安全策略解决跨域

参考 Disable Origin Policy CORS in Flutter web #46904 中的脚本方案(!!!#f9cb9c script solution !!!),通过设置环境变量 CHROME_EXECUTABLE 指定 chrome 启动脚本。

关于 CHROME_EXECUTABLE

Flutter checks this env variable before it launches Chrome. If you try to start flutter run -d chrome on a system that doesn’t have Chrome installed, Flutter will specifically ask you to either put it into the default location or to tell it where it is using CHROME_EXECUTABLE.

执行 flutter doctor 会检查 Chrome - develop for the web 这一项。
如果安装了 Google Chrome,正常会提示:

[✓] Chrome - develop for the web
    • Chrome at /Applications/Google Chrome.app/Contents/MacOS/Google Chrome

如果没有安装 Google Chrome,执行 flutter doctor 则提示没有设置环境变量 CHROME_EXECUTABLE

[✗] Chrome - develop for the web (Cannot find chrome executable at google-chrome)
    ! CHROME_EXECUTABLE not set

执行 flutter run -d chrome 命令可能会报以下错误:

Try setting CHROME_EXECUTABLE to a Chrome executable

基于以上提示,flutter run -d chrome 会检查 Google Chrome 默认安装目录,如果没有安装则尝试读取环境变量 CHROME_EXECUTABLE 查找 chrome 可执行路径,然后执行 CHROME_EXECUTABLE 启动独立的 Google Chrome 调试进程。

据此,我们可以定制 CHROME_EXECUTABLE,启动 Google Chrome 时传递一些安全策略参数,实现禁止CORS检查的目标。

创建 CHROME_EXECUTABLE

  1. 创建脚本 /usr/local/etc/chrome/launch-unsafe.sh,内容如下:
$ mkdir -p /usr/local/etc/chrome
$ vim /usr/local/etc/chrome/launch-unsafe.sh

#!/usr/bin/env bash

# 已存在不影响
mkdir -p /tmp/chrome_dev_test
# 末尾的 $* 或 $@ for macOS, %* for windows
# --disable-site-isolation-trials 参数可选
/Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome --args --user-data-dir="/tmp/chrome_dev_test" --disable-web-security $@

也可事先执行 mkdir -p /tmp/chrome_dev_test 创建 chrome 调试目录。

  1. 执行 sudo chmod +x /usr/local/etc/chrome/launch-unsafe.sh 赋予脚本可执行权限。

  2. ~/.zshrc 中配置以下命令,导出 CHROME_EXECUTABLE 变量:

    • 如果将脚本放置在 /Applications/Google\ Chrome.app/Contents/MacOS/ 目录,则升级会被覆盖移除!
    • 如果后续调试想恢复 Chrome 正常的 CORS 安全策略,可以在 ~/.zshrc 中注释掉这一句。
export CHROME_EXECUTABLE=/usr/local/etc/chrome/launch-unsafe.sh

Web FAQ:

  • During development, Chrome (on macOS, Windows, and Linux) and Edge (on Windows) are supported as the default browsers for debugging your app.
  • You can select Chrome or Edge as the target device in Android Studio/IntelliJ and VS Code.
  • The device pulldown should now include the Chrome (web) option for all channels.

设置环境变量 CHROME_EXECUTABLE 后,重新执行 flutter doctor -v,检测到 chrome 启动脚本:

[✓] Chrome - develop for the web
    • CHROME_EXECUTABLE = /usr/local/etc/chrome/launch-unsafe.sh

执行 flutter devices 正常应列出 Chrome (web) • chrome:

$ flutter devices
1 connected device:

Chrome (web) • chrome • web-javascript • Google Chrome 97.0.4692.99

重新执行命令 flutter run -d chrome 启动调试,将按照 launch-unsafe.sh 中的命令启动独立的禁用了安全策略的 Chrome 浏览器进行调试。

  1. 如果是通过 vscode 或 Android Studio 调试,在 ~/.zshrc 中添加或注释 export CHROME_EXECUTABLE 后,需要重启 IDE 生效。
  2. 新开启的 Chrome 调试进程,地址栏下会出现告警消息栏提示 “You are using an unsupported command-line flag: --disable-web-security. Stability and security will suffer.”。

在这里插入图片描述


关于 CHROME_EXECUTABLE 可参考以下:

  • Flutter No devices found with name or id matching ‘chrome’ on Windows 10

  • Cannot find Chrome. Try setting CHROME_EXECUTABLE to a Chrome executable. Flutter 2.0

  • test your Web Apps on your favorite browser

  • Changing your debugging browser for Flutter (MacOS)

  • Support Safari as a browser in flutter run #55323

  • How can I debug a Flutter Web App on Safari using the inspector?

# export CHROME_EXECUTABLE=/Applications/Safari.app/Contents/MacOS/Safari # 貌似无效?
export CHROME_EXECUTABLE="/Applications/Brave Browser.app/Contents/MacOS/Brave Browser"
export CHROME_EXECUTABLE="/Applications/Microsoft Edge.app/Contents/MacOS/Microsoft Edge"

修改 chrome.dart 禁用安全策略

修改 flutter SDK 中 web 调试的 chrome 调起脚本,在启动参数添加 --disable-web-security 禁用安全策略,也可解决协议访问跨域问题。

  • How to solve flutter web api cors error only with dart code?
  • flutter for web跨域解决方案
  1. cd flutter SDK directory: cd $FVM_HOME/versions/beta
  2. Remove or rename(mv) bin/cache/flutter_tools.stamp
  3. Modify(vim) packages/flutter_tools/lib/src/web/chrome.dart
  • Find and Comment '--disable-extensions'
  • Add '--disable-web-security'

重新执行 flutter run -d chrome 或通过 vscode launch 方式启动调试,创建的独立 chrome 进程将忽略 CORS 错误检查。

在这里插入图片描述

升级 flutterSDK 后需重新修改

  1. flutterSDK 经过以上涂改之后,想要逆向修改貌似无法恢复。
  2. 若要升级 flutterSDK,执行 flutter upgrade 需带选项 --force 强制更新,chrome.dart 的改动将被重置,需要重新修改一遍。

建议用 FVM 的某个版本(beta)专干此事,避免频繁修改 stable 版本!

升级后指定–web-hostname参数问题

11Oct21 更新:google-chrome 从 94.0.4606.71 升级为 94.0.4606.81 后,选项--web-hostname 指定参数 0.0.0.0 还是会报 CORS 错误。

flutter run -d chrome --web-hostname 0.0.0.0 --web-port 8080

不指定 --web-hostname 或指定具体 IP 10.68.59.70 则恢复正常!

后续更新 google-chrome,这个问题又不复存在,flutter run 选项 --web-hostname 指定参数 0.0.0.0 运行正常。

浏览器启用 Allow-CORS 插件

在桌面浏览器或安卓Kiwi浏览器通过IP链接( http://9.139.144.43/ )访问部署的flutterWeb产物,可在浏览器中安装Allow-CORS插件临时解决。

  1. 桌面端Google Chrome浏览器,安装启用 Allow CORS: Access-Control-Allow-Origin @chrome webstore 插件,可以访问 xxx.coding.net 域名下的协议。

    • Allow CORS: Access-Control-Allow-Origin
    • Moesif Origin & CORS Changer
    • CORS Unblock
  2. 安卓可安装 kiwi浏览器,然后在 chrome webstore 上搜索安装启用 Allow CORS: Access-Control-Allow-Origin 插件,也可以访问 xxx.coding.net 域名下的协议。

  • kiwi浏览器 下载地址:精品下载、安卓好玩网
  • Kiwi 浏览器:又一款支持 Chrome 扩展的安卓浏览器
  • 功能比 Chrome 更完善的 Kiwi Browser,让你在手机端也能使用扩展插件

Moesif Origin

However, Chrome does support cross-origin requests from localhost. Make sure to add a header for Access-Control-Allow-Origin for localhost.

Allow CORS extension will add the necessary HTTP Headers for CORS:

Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: "GET, PUT, POST, DELETE, HEAD, OPTIONS"
Access-Control-Expose-Headers: <you can add values here>

在 Google Chrome 浏览器工具栏,点击 CORS 插件图标:

①:点击 Toggle ON|OFF 启用或禁用插件;
②:点击 Open options page 打开配置页面;

在这里插入图片描述

③:勾选 2. Access-Control-Allow-Headers

在这里插入图片描述

部分协议OPTIONS预检跨域问题

本地调试常规 Chrome 浏览器和安卓 Kiwi 浏览器启动默认未禁用安全策略,对于复杂请求(例如Content-Type字段的类型是 application/json)将会在发起正式请求之前,先发起 OPTIONS 预检请求。
即使开启了 Allow-CORS 插件,有些协议的 OPTIONS 请求仍返回 500,导致不会继续发起 GET/POST 协议请求。

为什么会在GET或POST请求之前先进行一次OPTIONS请求?

  • AJAX跨域POST发送json时会先发送一个OPTIONS预请求
  • 浏览器每次请求都会先发一个OPTIONS请求

在有很多情况下,当我们在js里面调用一次ajax请求时,在浏览器那边却会查询到两次请求。第一次的Request Method是 OPTIONS,第二次才是真正的 GETPOST 请求。
查阅相关的资料之后发现,这是浏览器对复杂跨域请求的一种处理方式。在真正发送请求之前,会先进行一次Request Method为 OPTIONS 的"预检"请求(preflight)。它的作用是用于试探服务器响应是否正确,即是否能接受真正的请求。如果 OPTIONS 预检请求获取到的响应是拒绝性质的(例如返回状态码=500),那么就会停止第二次的真正请求。


从【我管理的】tab 点进流水线 test-artifacts,拉取当前构建详情(lastrun)OPTIONS 预请求返回200。

在这里插入图片描述

继续正式拉取当前构建详情(lastrun),GET 请求返回200。

点击切换到构建物 tab,拉取构建物列表(artifacts)预请求OPTIONS提示 Provisional headers are shown

在这里插入图片描述

拉取构建物列表(artifacts)预请求OPTIONS返回 500(Internal Server Error),将不再发起正式的 GET 请求。

在这里插入图片描述

解决方案:后台服务器同意放行拉取构建物列表(artifacts)的OPTIONS预检请求。

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

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

相关文章

《纳瓦尔宝典》笔记一——你是在跟自己竞争,这是一场单人游戏

目录 一、身体的健康是top1 二、你唯一拥有的就是时间 三、选择短期内更更痛苦的道路 四、人生早期有三个重大决定 五、从雇佣关系中解脱出来 六、找合作伙伴 七、你真的嫉妒别人吗 八、从期待中解放出来 九、向内求-内在的评价标准 十、人生的大赢家就是同时拥有时间…

[附源码]Nodejs计算机毕业设计基于RationalRose的教务管理系统开发Express(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程。欢迎交流 项目运行 环境配置&#xff1a; Node.js Vscode Mysql5.7 HBuilderXNavicat11VueExpress。 项目技术&#xff1a; Express框架 Node.js Vue 等等组成&#xff0c;B/S模式 Vscode管理前后端分…

基于java+swing+mysql图书管理系统3

大作业-基于java swing图书管理系统3一、系统介绍二、功能展示1.管理员登陆2.图书类别添加3.图书类别维护4.图书添加5.图书维护三、系统实现1.BookManageMainFrame.java四、其它1.其他系统实现五.获取源码一、系统介绍 该系统实现了用户登陆、图书类别管理(图书类别添加、图书…

JavaEE 初始化两个上下文对象,导致更新网站访问次数更新失败

问题描述 &#xff1a; 在做网站次数统计的时候&#xff0c;需要用到上下文对象&#xff0c;最终在上下文监听中发现上下文对象创建两次&#xff0c;销毁两次&#xff0c;导致数据库中网站访问次数统计更新失败。 原因 &#xff1a; 我们更改了项目的访问路径&#xff0c;就会导…

使用Java实现上传图片到七牛云

文章目录1.登录七牛云官网&#xff0c;注册账号并登录2.在项目中导入七牛云依赖3.编写创建文件名工具类4.编写连接七牛云工具类5.编写前端请求的Controller6.上传成功1.登录七牛云官网&#xff0c;注册账号并登录 2.在项目中导入七牛云依赖 <!-- 七牛云依赖 --> <!-…

力扣1832.判断句子是否为全字母句(cpp实现+解析)

文章目录1832.判断句子是否为全字母句解法一解法二解法三&#xff08;最优&#xff09;1832.判断句子是否为全字母句 难度&#xff1a;简单 力扣传送门&#xff1a; https://leetcode.cn/problems/check-if-the-sentence-is-pangram/description/ 题目要求&#xff1a; 全字…

Compose学习 -> Image()

基本使用&#xff1a; 通过资源id加载资源文件 Image(painter painterResource(id R.mipmap.test_01),contentDescription "这是内容描述") 通过url地址加载网络图片 1、引入第三方库&#xff0c;并添加网络权限 implementation ("io.coil-kt:coil-comp…

【深入浅出Nacos原理及调优】「原理分析专题」配置中心加载原理和配置实时更新原理分析

官方资源 官方资源 带着问题去思考 客户端长轮询的响应时间会受什么影响为什么更改了配置信息后客户端会立即得到响应客户端的超时时间为什么要设置为30s带着以上这些问题我们从服务端的代码中去探寻结论。 配置中心 (Configuration Center) 系统开发过程中通常会将一些需…

用Python调用OpenAI API做有趣的事

获取 API KEY 首先需要 可以开全局的梯子&#xff0c;选择日本或韩国节点&#xff0c;可以通过 ipinfo 检查当前 IP 地址是否为日本或韩国地区&#xff0c;然后访问 OpenAI 网站注册账号并完成认证。 如果自己完成账号认证的成本太高&#xff0c;可以在某宝直接购买一个已经通…

存储也能“一键美颜”?看 XOCP 如何助力互联科技图片业务转型

近日&#xff0c;XSKY星辰天合联合“互联科技”推出了“图片云在线处理”解决方案&#xff0c;提供海量图片高效存储访问和在线图片处理服务&#xff0c;深入业务场景简化操作流程&#xff0c;提升照片流转速度&#xff0c;为客户打造高效敏捷的拍照体验。互联科技&#xff08;…

DAS Over FC 技术允许 ATTO 分解存储并完成 vSAN 认证套件

一、介绍 最近&#xff0c;ATTO Technology, Inc. 以前所未有的方式 完成了 VMware vSAN ReadyNode 认证套件。 测试台本身是公式化的&#xff0c;以三台 Dell R640 服务器作为主机。 除了用于引导的 SD 卡和用于日志记录的单个 SAS SSD 之外&#xff0c;不存在任何内部存储…

EXCEL基础:IFNA、VLOOKUP、SUMIFS函数的使用

注意&#xff1a;本操作数据来源于excel home&#xff0c;特此声明。 查看原始数据&#xff0c;如下所示为【商品】的相关信息&#xff1a; 查看原始数据&#xff0c;如下所示为【供应商】的相关信息&#xff1a; 主要目的&#xff1a;把以上相关信息搞在一张表上。 把下表…

基于jsp+mysql+ssm台球俱乐部管理系统-计算机毕业设计

项目介绍 台球俱乐部系统设计主要是管理员登录后对整个系统相关操作进行处理&#xff0c;可进行管理员的添加和删除&#xff0c;会员信息管理、付费信息管理、球桌信息管理、订桌信息管理等操作管理。采用目前最流行的ssm框架和eclipse编辑器、mysql数据库设计并实现的 本系统…

[附源码]计算机毕业设计冬奥会网上商城Springboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; Springboot mybatis MavenVue等等组成&#xff0c;B/S模式…

什么是BPM系统?BPM流程管理系统介绍

一、什么是BPM系统&#xff1f; BPM系统&#xff08;英文全称&#xff1a;Business Process Management&#xff0c;翻译后简称BPM&#xff09;即业务流程管理系统&#xff0c;是指对端到端业务流程进行建模、分析和优化&#xff0c;以实现战略业务目标&#xff0c;其特点是注…

Elasticsearch:如何在 CentOS 上创建多节点的 Elasticsearch 集群 - 8.x

在我之前的文章 “Elasticsearch&#xff1a;使用 RPM 安装包来安装 Elastic Stack 8.x” 里&#xff0c;我详细地介绍了如何使用 RPM 安装包来安装 Elastic Stack 8.x。在今天的文章中&#xff0c;我来详细描述如何从零开始来创建一个含有三个节点的 Elasticsearch 集群。我们…

python文本处理尝试

Python文本处理尝试 最近打算看CSAPP&#xff0c;GitHub上看到有英语字幕ass源文件&#xff0c;想把字幕提取出来提高学习效率&#xff0c;先把ass文件转成txt文件&#xff0c;发现是这样&#x1f447; 都在Dialogue的后面&#xff0c;打算尝试提取一下 不太熟练&#xff0c;下…

解决 Eclipse 中不见 Maven 问题

在 Windows -> Preferences 不见 Maven 和 File -> New -> Project 均不见 Maven&#xff0c;但 Help -> Eclipse Marketplace -> installed 却可见已经安装&#xff0c;网上的各种方法都不能解决。 解决步骤&#xff1a; 关闭 Eclipse&#xff1b;清空目录 C:…

肿瘤网络平台

肿瘤网络平台是为广大肿瘤医生量身定做的学习&#xff0c;交流功能健全的网络平台&#xff0c;平台汇聚了会议、病例、专家讲堂等内容&#xff0c;广大的肿瘤医生可以随时分享、讨论专业知识。 一、平台价值 让医生 了解肿瘤前沿进展 提高业务水平 丰富临床经验 二、平台架构…

如何挖掘外贸客户需求

是客户的衣食父母。 俗话说“知己知彼&#xff0c;百战不殆”&#xff0c;外贸业务员都想把自己的产品推销给客户。除了知道自己产品的特点&#xff0c;还应该知道客户的需求是什么。因此&#xff0c;前期的客户调研工作非常重要。 不是所有的客户都是意向或潜在客户。只有当…