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

2023-05-16

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预检请求。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Flutter Web CORS解决方案1-禁用浏览器安全策略 的相关文章

  • Week12作业 C -必做题 - 3 [HDU - 1024]

    题目链接 https vjudge net problem HDU 1024 题目描述 n个数的序列a xff0c 从中选取m个互不相交的闭区间 xff0c 使这些区间中的数的和最大 xff0c 输出最大和 1 i n 1e6 32768
  • 实验与分析 —— numpy.vectorize

    函数功能 numpy vectorize函数可以实现任意函数的向量化 xff0c 从而避免在python中使用循环 xff0c 提高效率 还真不一定能提高效率 另外 xff0c 用好函数的signature参数 xff0c 可以让本来就是处
  • nist sp 800-90(A|B|C) series RNG三部曲

    随机数生成器 熵源 随机比特生成器构造 一个公共的随机数信标 randomness beacon NIST Special Publication 800 90A Recommendation for Random Number Gener
  • [LeetCode 1765] 地图中的最高点

    文章目录 题目链接题目描述用例提示思路代码 题目链接 https leetcode cn com problems map of highest peak 题目描述 给你一个大小为m x n的整数矩阵isWater xff0c 它代表了一个
  • [LeetCode 1763] 最长的美好子字符串 [参考]

    文章目录 题目链接题目描述示例1示例2示例3示例4提示题解1题解2题解3 参考自官方题解 这是简单题 xff1f xff1f xff1f 数据规模后边加3个0直接玩完 题目链接 https leetcode cn com problems
  • 直方图均衡化原理推导

    问题描述 对于服从任意分布的连续型随机变量 R 0 R 1
  • 给吃饭嘎嘎香的李峋爱心代码

    span class token keyword import span random span class token keyword from span math span class token keyword import span
  • Linux服务器启动jar包报启动main类ClassNotFoundException

    Linux服务器启动jar包报启动main类启动异常 今天部署文件时遇到了启动异常报错 xff0c 在网上找了好久没发现我要的答案 xff0c 没办法只能自己找一下问题了 事件回顾 和往常一样打了个jar包就往服务器上扔 xff0c 启动时
  • sql中json数据的提取保存

    sql中json数据的提取保存 文章目录 sql中json数据的提取保存1 需求描述2 数据构建3 Json类型数据的提取令存3 1 代码分析3 2 结果呈现 4 jsonselect Onecount4 1 单key值需求4 2 代码编辑
  • pytorch DataLoader处理不定长序列

    本篇博客的目的是 xff1a 将下图这样的输入 xff08 每个tensor表示一个句子 xff0c 01为句子标签 xff09 xff1a 转化为下图所示的输出 xff08 batch size 61 2 xff09 元组的第一个元素为填
  • 《统计学习方法》之最大熵模型代码实现

    原理这里就不赘述了 见参考链接4 说一些自己学习时困惑的地方 xff0c 如果有不对的地方 xff0c 还望各位评论指正 下面从w的求解开始说起 xff0c 下面是模型的对数似然函数 xff1a w
  • NLP实践项目二:基于RNN、CNN的文本多分类(pytorch实现)

    直接看代码 xff1a github传送门 数据集 xff1a Classify the sentiment of sentences from the Rotten Tomatoes dataset 1 数据预处理 本项目实现了两种数据预
  • Vue3 中setup()和<script setup><script>

    setup 方法 在组件创建之前执行 xff0c 是组合式 API 的入口 方法可以接受两个参数 props 和 context setup方法中 xff0c 要将数据暴露给页面模板 xff0c 需要结合ref 和reactive xff0
  • NLP实践项目三:基于BiLSTM-CRF的实体识别(pytorch实现)

    直接看代码 xff1a github传送门 数据集 xff1a Conll2003 1 数据预处理 将txt中的文件读出然后将句子和对应的标签序列存入csv文件中 xff0c 便于使用torchtext完成数据读取 2 模型定义 上图是Bi
  • NLP实践项目五:基于GRU的古诗生成(pytorch实现)

    直接看代码 xff1a github传送门 数据集 xff1a 古诗数据集 1 数据预处理 xff1a 将古诗存为上图的格式 xff0c 每行一首诗 xff0c 便于使用torchtext读取 2 模型定义 模型就是一个简单的GRU模型 x
  • 第17周 算法思想-二分搜索

    算法思想 二分查找 二分查找应用场景 xff1a 寻找一个数 寻找满足条件的某个区间的左侧边界 寻找满足条件的某个区间的右侧边界 建议学习 xff1a 二分查找详解 二分查找的基本框架 span class token keyword in
  • 第18周 算法思想-搜索(BFS)

    文章目录 BFS计算在网格中从原点到特定点的最短路径长度组成整数的最小平方数数量最短单词路径 BFS 计算在网格中从原点到特定点的最短路径长度 1091 Shortest Path in Binary Matrix Medium 组成整数的
  • 第19周 算法思想 搜索(BFS&DFS)

    文章目录 BFS最短单词路径 xff08 输出所有路径 xff09 到离得最近的0的距离 DFS查找最大的连通面积填充封闭区域括号生成 最短单词路径 xff08 输出所有路径 xff09 126 Word Ladder II Hard 到离
  • c++ 正则表达式-基础操作

    正则表达式是一个非常强大的工具 xff0c 主要用于字符串匹配 如何在c 43 43 中使用正则表达式 xff1f 下面就简要介绍一下c 43 43 中正则表达式相关函数的用法 本篇博客中所涉及到的函数及其功能如下表所示 xff1a 函数功
  • 机器学习,计算机视觉和模式识别分别有何联系?

    目录 1 定义1 0 模式识别 xff1a 1 1 机器学习 xff1a 1 2 计算机视觉 xff1a 2 联系2 0 模式识别 vs 机器学习 2 1 模式识别 vs 计算机视觉 3 参考链接 xff1a 1 定义 1 0 模式识别 x

随机推荐