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

bug-跨域访问问题

问题场景

  1. 自定义 header,导致跨域问题
    一个大屏项目,设置请求接口获取数据时,有的接口能够正常返回数据,有的接口提示跨域(接口域名不同),后端也进行支持跨域设置,结果还是提示跨域;
    通过测试发现,使用Axios直接请求,没有产生跨域,对比代码发现,请求拦截器添加了一个自定义header,去掉就正常了;
    问题原因是自定义header,后端配置应该也有问题导致的
    该问题是使用方式一处理的
  • 方式一:前端处理,去掉自定义 header;
  • 方式二:后端处理,Access—Control-Allow-Headers 配置中添加自定义 header,或改成*
  1. 使用chrome访问本地地址是提示跨域
    2.1 控制台报错: The request client is not a secure context and the resource is in more-private address space private
  • 方式一:使用火狐浏览器
  • 方式二:配置chrome
    在地址栏中输入chrome://flags/,
    找到 Block insecure private network requests.选项设置为Disabled,
    找到 Insecure origins treated as secure 选项设置为 Enabled,同时设置访问地址(如:http://192.169.16.200:8088)

2.2 控制台报错:Response to preflight request doesn’t pass access control check: No ‘Access-Control-Allow-Origin’ header is present on the requested resource.
后端设置Access-Control-Allow-Origin

总结---------------------------------------------------------------------------------------------------------------

跨域是什么

是浏览器本身的安全策略产生的问题
当访问网页的域与页面内调用接口的域不一致(域不一致包含协议、域名、端口号不一致),就会产生跨域问题

跨域方案

  1. JSONP 方案

利用 <script> 标签没有跨域限制的漏洞,网页可以得到从其他来源动态产生的 JSON 数据。JSONP 请求一定需要对方的服务器做支持才可以。

```
// 跨域加载资源标签
<img src=XXX>
<link href=XXX>
<script src=XXX>
``````
<!-- 前端代码 -->
function jsonp(req) {let script = document.createElement("script"); // 创建一个script标签let url = req.url + "?callback=" + req.callback.name; // 拼接urlscript.src = url; // 设置script标签的src属性document.getElementsByTagName("head")[0].appendChild(script); // 将script标签添加到head标签中
}function sayHello(res) {console.log("hello", res.data);
}
jsonp({url: "http://localhost:3000",callback: sayHello
})``````
<!-- 后端代码 -->
const http = require("http");
const urllib = require("url");const port = 3000; // 定义端口const server = http.createServer((req, res) => {let params = urllib.parse(req.url, true); // 解析urllet callback = params.query.callback; // callback是函数名,解析出来if (callback) {let data = { data: "我就是你要的数据" }; // 定义要向前端返回的数据res.end(callback + "(" + JSON.stringify(data) + ")"); // 相应数据,callback(参数)的形式}
})server.listen(port, function () {console.log("jsonp server is on");
});```
  1. CORS
    CORS 需要浏览器和后端同时支持。IE 8 和 9 需要通过 XDomainRequest 来实现。

  2. postMessage 与 message 事件
    window 与 iframe 之间通信

    <!-- 通过 postMessage 发送信息到指定位置数据 -->
    otherWindow.postMessage(message, targetOrigin, [transfer]);
    <!-- 通过 message 事件接收数据 -->
    window.addEventListener(“message”, dealMessage, false);
    
  3. websocket
    前后端使用 websocket 技术进行数据传递

  4. Node 中间件代理(二次跨域)
    实现原理:同源策略是浏览器需要遵循的标准,而如果是服务器向服务器请求就无需遵循同源策略。

  5. Nginx 反向代理
    类似 Node 中间件代理

http://www.lryc.cn/news/232915.html

相关文章:

  • Babyk勒索病毒数据集恢复,计算机服务器中了babyk勒索病毒怎么办?
  • (.htaccess文件特性)[MRCTF2020]你传你呢 1
  • 微软Ignite 2023大盘点:GPT-4 Turbo、DALL-E 3等
  • 应用架构的演进 I 使用无服务器保证数据一致性
  • jupyter修改默认打开目录
  • HTML5学习系列之标题和正文、描述性信息
  • 互联网医院系统:数字化时代中医疗服务的未来
  • (C语言)输入一个序列,判断是否为奇偶交叉数
  • 蓝桥杯模拟赛:最远滑行距离 ← dfs
  • 广东电信手机号余额查询接口
  • 这次轮到微软炸场了;5000+AI工具调研报告 (500万字);狂打一星开喷AI聊天机器人;CMU LLM课程;AI创业的方向与时机 | ShowMeAI日报
  • --max-old-space-size=8192报错
  • 单区域OSPF配置
  • VsCode 安装 GitHub Copilot插件 (最新)
  • 人工智能基础_机器学习039_sigmoid函数_逻辑回归_逻辑斯蒂回归_分类神器_代码实现逻辑回归图---人工智能工作笔记0079
  • 购买阿里云服务器需要多少钱?活动价3000元-5000元的阿里云服务器汇总
  • CentOS修改root用户密码
  • Android消息机制(Handler、Looper、MessageQueue)
  • Pikachu漏洞练习平台之XXE(XML外部实体注入)
  • ubuntu中/etc/rc.local和/etc/init.d/rc.local的区别是什么
  • vue项目中 commonJS转es6
  • 【C++】AVL树(动图详解)
  • 「Verilog学习笔记」用3-8译码器实现全减器
  • rocketmq: MQClientException: No route info of this topic
  • 【Vue全家桶 合集 关注收藏】
  • react+video.js h5自定义视频暂停图标
  • CentOS和Ubuntu中防火墙相关命令
  • 学习笔记5——对象、直接内存、执行引擎,string
  • 【node】如何在打包前进行请求等操作npm run build
  • 鸿蒙4.0真机调试踩坑