跨域的五种最常见解决方案

news2024/12/25 12:56:48

这是一篇笔记

什么是跨域?

跨域不是问题,是一种安全机制。浏览器有一种策略名为同源策略,同源策略规定了部分请求不能被浏览器所接受。

值得一提的是:同源策略导致的跨域是浏览器单方面拒绝响应数据,服务器端是处理完毕并做出了响应的。

什么是同源策略

一个url由三部分组成:协议,域名(ip地址),端口

只有当协议,域名,端口都一致的时候,才被称为同源。

而同源策略规定,只有发送请求的那一边和接受请求的那一边处于同源的情况下,浏览器才会接受响应。

举个例子

发送请求地址:http:47.96.127.5:8080/index    接受请求地址:http:47.96.127.5:8081/index //不同源 端口不同
发送请求地址:http:47.96.127.5:8080/index     接受请求地址:http:47.96.127.6:8080/index //不同源 ip不同
发送请求地址:http:47.96.127.5:8080/index     接受请求地址:https:47.96.127.5:8080/index //不同源 协议不同
发送请求地址:http:47.96.127.5:8080/index     接受请求地址:http:47.96.127.5:8080/login //同源 协议,端口,ip都相同,路径不同无所谓
复制代码

而当我们的请求不符合同源策略的时候。往往会出现以下错误👇

解决跨域常见的5种方法

第一种:JQuery的ajax(推荐JQuery项目中使用)

jq的ajax自带解决跨域的方法。底层原理采用的JSONP的跨域解决方案。如下

function callback(){
    console.log("月薪一千五,心比美式苦")
}

$.ajax({
    url: 'http://www.domain2.com:8080/login',
    type: 'get',
    dataType: 'jsonp',  // 请求方式为jsonp  设置跨域的重点
    jsonpCallback: "callBack",  // 回调函数
});
复制代码

在JQ项目中,这是最常见的解决方案。

第二种:script标签解决跨域(远古Web项目中使用)

如果你的项目是祖传下来的。没有框架连JQuery都没有。没关系,我们可以尝试使用原生的方法去解决。

原生采用的是script标签可以不受跨域限制的特性来实现跨域。

  <script>
            // 回调
            function callBack(res) {
                console.log("跨域的回调",res);
               // ...完成你所有操作后记得删除script↓
               document.head.getElementsByClassName("script")[0].remove();
            }

            const scriptDom = document.createElement('script');
            scriptDom.type = 'text/javascript';
            scriptDom.class = 'script'; //用于删除
            // 传参一个回调函数名给后端,方便后端返回时执行这个在前端定义的回调函数
            scriptDom.src = 'http://192.167.0.152:9996/inface?callback=callBack';
            document.head.appendChild(script); //将标签挂载到dom上
        </script>
复制代码

这里需要注意的是,使用完请求之后记得删除script,否则会随着请求的变多script标签会一直挂载在DOM上。

在远古的web中,这是一种方案。但现在已经不用了。

vue/react/jq等框架性项目中不要使用这种方法,不是不行,只是有更好的选择

第三种:前端代理解决跨域

每一个框架的代理配置都不太一样。这里仅以我使用的umi.js(react)为例。

Umi.js框架会有 config.ts / config.js 文件,文件中会有proxy字段、字段按图中配置方法。即可完成跨域

第四种:服务端代理(Nginx代理)

nginx代理一般使用在生产环境。是服务端解决跨域的一种方案。

简单配置模板👇

#如果监听到请求接口地址是 www.xxx.com/api/page ,nginx就向http://www.yyy.com:9999/api/page这个地址发送请求
server {
     listen       80; 
        server_name  www.xxx.com;
        #判过滤出含有api的请求
        location /api/ { 
            proxy_pass http://www.yyy.com:9999; #真实服务器的地址
        }
}
复制代码

注意,nginx配置完代理后需要重启nginx,nginx代理是生产环境的常用方案

第五种:后台(逻辑层)添加响应头解决

Access-Control-Allow-Origin响应头的意思是,安全同行的请求。

举个例子 http://192.168.0.103:8080 向http://192.168.0.102:8080 发送了请求,结果因为域名不一样,在返回信息的时候因为IP地址不一致被拦截。

但是如果http://192.168.0.102:8080 在响应头中的 Access-Control-Allow-Origin 字段中携带上属性值'http://192.168.0.103:8080' 如下

//响应头
Access-Control-Allow-Origin':'http:/ /192.168.0.103:8080'
复制代码

这就等于告诉浏览器,http://192.168.0.102:8080 这个地址是安全的,请不要拦截。

这样,http://192.168.0.103:8080 就可以接受来自 http://192.168.0.102:8080 返回的信息。

当然,我们也可以进行所有域名均不拦截的设置(如下)

//响应头
// * 代表所有域名均不拦截
Access-Control-Allow-Origin':'*'
复制代码

node案例如下

res.writeHead(200, {
    Access-Control-Allow-Origin':'http://192.168.0.103:8080'
});

//或者

res.writeHead(200, {
    Access-Control-Allow-Origin':'*'
});

复制代码

并不建议此种方案,因为安全性不高。自己写小练习的时候建议使用,因为真的很方便。

总结

跨域的常见的五种解决方案如下

  1. jsonp,代表:jquery的$.ajax。(仅限JQuery项目使用)
  2. script标签解决跨域(远古web使用的方案,已不建议使用)
  3. 前端代理
  4. nginx代理
  5. 设置响应头(不建议使用,安全性不高,小练习可以用用,方便)

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

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

相关文章

C#基于asp.net的企业人事管理系统的研究与实现

&#xff08;一&#xff09;任务 1.本课题的任务是对人事管理系统的管理过程进行分析&#xff0c;列出逻辑实现过程&#xff0c;对系统进行逻辑设计和数据库设计&#xff1b; 2.主要实现系统管理、档案管理、考勤管理、薪水管理等功能&#xff1b; 3.实现企业员工的相关信息&am…

一篇文章教你解决node-sass 4.12.0 安装失败,一劳永逸

已知&#xff1a; 使用mac电脑使用的node版本是v14.20.0 问题&#xff1a;在安装node-sass 4.12.0的时候报错如下 看到这一堆错误&#xff0c;千万不要立马复制粘贴到浏览器去搜&#xff0c;感觉像无头苍蝇乱撞&#xff0c;好歹稍微看一下什么意思。 显而易见是有一个文档40…

浅析低代码开发的典型应用构建场景v

在数字经济蓬勃发展的大势之下&#xff0c;企业软件开发人员供给不足、开发速度慢、开发成本高、数字化和智能化成效不明显等问题日益凸出&#xff0c;阻碍了企业的数字化转型。 而近年来&#xff0c;低代码的出现推动了经济社会的全面提效&#xff0c;也成为人才供求矛盾的润…

【Docker】限制已运行容器的Cpu和内存

docker限制已运行容器的Cpu和内存 本文首发于 慕雪的寒舍 1.问题描述 最近云服务器的内存经常不够用&#xff0c;而且是莫名其妙的增多&#xff0c;在腾讯云的控制台里面看&#xff0c;4g的内存占用了3.2g&#xff0c;就卡到连ssh都连不上了 PS: 已换过网络和设备&#xff0c…

只要10分钟,零代码基础搞定炫酷大屏设计(内附详细教程)

近几年可视化大屏再次被推上热搜&#xff0c;无论是已经结束的疫情时代指挥中心大屏&#xff0c;还是每年购物节的大屏数据成交额&#xff0c;或者是日常会议中的大屏分析&#xff0c;到处都是可视化大屏的身影。 有人会说&#xff0c;这种大屏一定需要大量的财力、技术顶端的…

开源构建系统Buck2发布

看来最近 Meta 的工程师是一点都没有闲着&#xff0c;前两天刚开源 AI 图像分割模型&#xff0c;这不就又发布了名为 Buck2 的开源构建系统。 Buck2 是一个已经在 Meta 内部使用了一段时间的大型构建系统&#xff0c;目前 Meta 有数千名开发人员正在使用该构建系统&#xff0c;…

IP地址配置

1.vi /etc/sysconfig/network-scripts/ifcfg-ens33 &#xff08;在配置文件中修改&#xff09; 配置文件内容为&#xff1a; IPADDR:配置IP地址 NETMASK:配置子网掩码 GATEWAY:配置网关 DNS:配置dns地址 BOOTPROTO&#xff1a;设置获取ip的方式\DHCP为动态获取\ static为…

C++(GCC)生成和使用静态库

C&#xff08;GCC&#xff09;生成和使用静态库 文章目录 C&#xff08;GCC&#xff09;生成和使用静态库1、前言1.1 什么是静态库1.2 静态库优缺点1.3 C使用静态库的方法1.4 注意事项 2、linux下C生成静态库.a3、链接使用静态库 更多精彩内容&#x1f449;个人内容分类汇总 &a…

可算是熬出头了,测试4年,费时8个月,入职阿里,涨薪14K

前言 你的努力&#xff0c;终将成就无可替代的自己。 本科毕业后就一直从事测试的工作&#xff0c;和多数人一样&#xff0c;最开始从事点点点的工作&#xff0c;看着自己的同学一步一步往上走&#xff0c;自己还是在原地踏步&#xff0c;说实话这不是自己想要的状态。 一年半…

蓝牙耳机接打电话哪个比较好?接打电话最好的蓝牙耳机

技术已经发展到如此程度&#xff0c;耳机可以淹没嘈杂环境中不断出现的杂音&#xff0c;同时还能让我们在通话、音乐和娱乐方面保持清晰&#xff0c;既然如此&#xff0c;我们就来整理一下2023年适合通话和娱乐的无线耳机清单。 一、南卡小音舱Lite2蓝牙耳机 参考价格&#x…

Ubuntu系统下Python的虚拟环境搭建方法

文章目录 参考链接&#xff1a;一、Python虚拟环境的作用及创建方法简介1. 创建虚拟环境的必要性2. venv、virtualenv、pipenv三种创建虚拟环境方法比较2.1 搭建Python虚拟环境的方法2.2 venv、virtualenv方法2.3 pipenv方法 二、 virtualenv搭建虚拟环境1. 环境准备1.1 安装vi…

AI数字人产品“世优BOTA”发布会落幕,世优科技纪智辉演讲回顾

4月20日&#xff0c;世优科技式发布了新一代AI数字人产品——“世优BOTA”。在会上&#xff0c;世优科技创始人纪智辉介绍了数字人技术、驱动形式、数字人应用、“世优BOTA”的前世今生及未来。 以下是纪智辉的演讲内容概要&#xff1a; 各位嘉宾、各位朋友&#xff1a;大家下…

Storm proxies动态SEO监测优化为什么要大量用到http代理ip?

SEO监测和优化通常需要大量使用HTTP代理IP来实现以下几个方面的需求&#xff1a; 模拟不同地区的搜索结果&#xff1a;搜索引擎通常会根据用户所在地区提供不同的搜索结果&#xff0c;因此需要使用HTTP代理IP模拟不同地区的搜索结果&#xff0c;以便监测和优化针对不同地区的SE…

Matlab 相机标定

详细的原理可以看这篇 计算机视觉-相机标定&#xff0c;写的很赞 Step1. 准备 首先准备打印好的黑白棋盘格图片&#xff0c;并且保证表面的平整&#xff0c;例如35*35的棋盘格&#xff0c;贴在亚克力板上。 Step2. 拍摄 用相机拍摄棋盘格分别在取景框左上角、右上角、左下…

openGauss数据库pg_xlog爆满问题解决

文章目录 问题现象问题定位解决办法总结 问题现象 最近有一个之前搭的环境登不上了&#xff0c;好久没用想拿来测试的时候发现启动不了。启动时报错&#xff1a; [Errno 28] No space left on device query也不行了&#xff0c;提示没有空间了。 查询磁盘使用情况 df -h …

车间设备能源管理系统作用有哪些?

由于能源消耗不断的增加&#xff0c;对于高耗能企业要实现节能转型&#xff0c;淘汰落后高耗能产业&#xff0c;提供能源的有效利用&#xff0c;实现节能减排&#xff0c;合理利用能源&#xff0c;从而促进企业的经营绩效。 车间设备能源管理系统优点 1.精细化管理 可以对车…

探索【Stable-Diffusion WEBUI】的附加功能:图片缩放抠图

文章目录 &#xff08;零&#xff09;前言&#xff08;一&#xff09;附加功能&#xff08;图片处理&#xff09;&#xff08;1.1&#xff09;处理对象&#xff08;Source&#xff09;&#xff08;1.2&#xff09;缩放&#xff08;Scale&#xff09;&#xff08;1.2.1&#xff…

【论文精读】TNNLS 2022 - 基于深度学习的事件抽取研究综述

【论文精读】TNNLS 2022 - 基于深度学习的事件抽取研究综述 【论文原文】&#xff1a;A Survey on Deep Learning Event Extraction Approaches and Applications 【作者信息】&#xff1a;Li, Qian and Li, Jianxin and Sheng, Jiawei and Cui, Shiyao and Wu, Jia and Hei,…

畅谈自然语言处理——初识NLP技术

畅谈自然语言处理——初识NLP 文章目录 畅谈自然语言处理——初识NLP一、引言二、NLP技术的定义分类三、三个发展阶段1、基于规则的算法2、基于统计的NLP算法3、基于深度学习的NLP算法 结语 一、引言 最近&#xff0c;一个名为ChatGPT的模型将计算机领域震撼&#xff0c;它以对…

Linux系统之部署webmin开源管理工具

Linux系统之部署webmin开源管理工具 一、webmin简介1.webmin简介2.webmin特点 二、本地环境介绍1.本次实践目的2.本地环境规划 三、检查本地环境1.检查操作系统版本2.检查系统内核版本 四、配置webmin的yum仓库1.编辑webmin.repo仓库文件2.查看yum仓库状态 五、部署webmin1.添加…