跨域怎么解决

跨域解决主要有以下⼏种:
  • JSONP
  • CORS
  • Nginx代理
  • document.domain
  • window.name
  • postMessage+iframe

1.JSONP

我们知道写 HTML 代码的时候,加⼊图⽚链接就不会有获取不到图⽚的问题。这是因为图
⽚资源并没有进⾏ ajax 请求,⽽且 script 标签是没有同源策略的,可以进⾏资源请求,可
以说是⼀个前端设计的漏洞。
// 1.回调函数
function handleResponse(data){
console.log(data);
}
// 2.动态创建 script
var script = document.createElement('script');
script.src = 'http://test.com/json?callback=handleResponse';
document.body.insertBefore(script,document.body.firstChild);
利⽤ script 标签⽴即下载并执⾏的特性,我们就可以在回调函数中拿到返回来的数据。那
么是不是所有的情况都可以呢?显然不是的。虽然实现是⽐较简单的操作,但是有缺点:
1. 仅限于 GET 请求
2. 有安全问题,万⼀有恶意代码返回,前端⽆法阻⽌
3. ⽆法检测请求是否成功

2.CORS

CORS是跨域资源共享(Cross-origin resource sharing)

要想利⽤这个技术关键是在于服务端,设置返回的 Access-Control-Allow-Origin 响应头允
许跨域操作,发送请求时有两种情况:
  • 简单请求
  • 复杂请求
①简单请求
当使⽤以下⽅法之⼀:
  • GET
  • HEAD
  • POST
Content-Type 的值为以下之⼀:
  • text/plain
  • multipart/form-data
  • application/x-www-form-urlencoded

才会发起简单请求,浏览器判断是简单请求的话就会在请求头添加 origin 字段,值是发起
请求的所在的源。服务端收到请求后会判断 origin 是否在⾃⼰的许可范围,如果不在就拒
绝,如果在就会有以下的响应头添加:
  • Access-Control-Allow-Origin (必选):告诉客户端我接受请求,值为 origin 的值,若
    允许所有源请求就会返回 *
  • Access-Control-Allow-Credentials(可选):告诉浏览器发送请求时携带 Cookie
    true 表⽰允许 false 表⽰禁⽌。
  • Access-Control-Expose-Headers(可选):额外给客户端返回的头部字段。
②复杂请求
复杂请求会有两次,第⼀次是发送⼀个预检请求,使⽤的⽅法是 options ,询问服务器是
否允许我进⾏跨域请求资源。并且允许客户端⾃定义请求头的类型,询问服务器是否允
许。
OPTIONS /cors HTTP/1.1
Origin: http://test.com
Access-Control-Request-Method: PUT
Access-Control-Request-Headers: Custom-Header1,Custom-Header2
Host: target.com
Accept-Language: en-US
Connection: keep-alive
User-Agent: Mozilla/5.0...
然后服务器会进⾏验证,还会在响应头进⾏说明允许你的请求。
HTTP/1.1 200 OK
Date: Mon, 01 Dec 2008 01:15:39 GMT
Server: Apache/2.0.61(Unix)
Access-Control-Allow-Origin: http://test.com
Access-Control-Allow-Methods: GET, POST, PUT
Access-Control-Allow-Headers: Custom-Header1,Custom-Header2
Access-Control-Max-Age: 1728000
Content-type: text/html; charset=utf-8
Content-Encoding: gzip
Content-Length: 0
Keep-Alive: timeout=2, max=100
Connection: Keep-Alive
Content-Type: text/plain
  • Access-Control-Allow-Origin :告诉客户端,允许你这个源的请求
  • Access-Control-Allow-Methods:告诉客户端,服务端允许的跨域 AJAX 请求的类
    型,也可进⾏ GET 或者 POST 请求
  • Access-Control-Allow-Headers:告诉客户端,服务端允许的发送请求时的⾃定义请
    求头
  • Access-Control-Max-Age: 告诉客户端预检请求的有效期,省去了多次的预检请求。
    也就是说, 1728000 秒内你可以直接发送真正的 AJAX 请求,不⽤每次询问

3.Nginx代理

nginx ⽬录下的 nginx.conf 修改,通过反向代理的⽅式来实现跨域请求。
# /所有以apis开头发起的请求会被分发到myserver
location ^~ /apis/ {
proxy_pass http://myserver; # 负载均衡名,写你请求的服务器地址
proxy_set_header X-real-ip $remote_addr;
proxy_set_header Host $http_host;
}

4.document.domain

该⽅式只能⽤于⼆级域名相同的情况下,⽐如 a.test.com b.test.com 适⽤于该⽅式。
只需要给⻚⾯添加 document.domain = 'test.com' 表⽰⼆级域名都相同就可以实现跨域。

5.window.name

window.name 有⼀个奇妙的性质,⻚⾯如果设置了 window.name ,那么在不关闭⻚⾯的
情况下,即使进⾏了⻚⾯跳转 location.href=... ,这个 window.name 还是会保留。
// 打开必应 https://www.bing.com/
// 打开控制台
> window.name
""
> window.name='test';
"test"
> location.href='http://www.google.com';
"http://www.google.com"
Navigated to https://www.google.com/> window.name
"test"

6.postMessage+iframe

这种⽅式通常⽤于获取嵌⼊⻚⾯中的第三⽅⻚⾯数据。⼀个⻚⾯发送消息,另⼀个⻚⾯判
断来源并接收消息
// 发送消息端
<div>
<div id="color">Frame Color</div>
</div>
<div>
<iframe id="child" src="http://b.com/b.html"></iframe>
</div>
window.onload=function(){
window.frames[0].postMessage('getcolor','http://b.com');
}
// 接收消息端
window.addEventListener('message',function(e){
console.log(e)
},false);
postMessage(data,origin) ⽅法接受两个参数:
  • data: 要传递的数据, html5 规范中提到该参数可以是 JavaScript 的任意基本类型或可
    复制的对象,然⽽并不是所有浏览器都做到了这点⼉,部分浏览器只能处理字符串参
    数,所以我们在传递参数的时候需要使⽤ JSON.stringify() ⽅法对对象参数序列化
  • origin:字符串参数,指明⽬标窗⼝的源,协议 + 主机 + 端⼝号 [+URL] URL 会被忽
    略,所以可以不写,这个参数是为了安全考虑, postMessage() ⽅法只会将 message
    传递给指定窗⼝,当然如果愿意也可以把参数设置为 "*" ,这样可以传递给任意窗⼝,
    如果要指定和当前窗⼝同源的话设置为 "/"

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

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

相关文章

Superset二次开发之环境部署(Windows版)

本地环境版本介绍: 编号 名称 版本 1supersetv3.0.0rc32Pythonv3.10.123Nodev16.20.24npmv8.19.45Anacondav3 1.下载源码 #下载源码 git clone https://github.com/apache/superset.git ##速度慢可替换为 https://gitclone.com/github.com/apache/superset.git #进入项目目录…

前端性能优化四十七:工程目录设计范式种类

1. 模块化: ①. 将一个复杂应用根据预设规范封装为多个块并组合起来:a. 对内实现数据私有化b. 对外暴露接口、其它模块通信②. 在前端工程化具体体现:a. 在文件层面上对代码与资源实现拆分与组装b. 将一个大文件拆分为互相依赖的小文件,再统一拼装与加载1. 工程目录设计范式种…

搜维尔科技:Geomagic Phantom Premium 1.5六自由度力反馈设备开箱测试!

搜维尔科技&#xff1a;Geomagic Phantom Premium 1.5六自由度力反馈设备开箱测试&#xff01; Geomagic Phantom系列产品中首屈一指的力反馈产品Phantom Premium 六自由度力反馈设备&#xff08;原Sensable&#xff09;能够提供高度精确的3D对象操作&#xff0c;使用户能够探索…

在Go中解析HTTP请求中的表单数据

想象一下&#xff0c;你收到了一封神秘的信件&#xff0c;信上写着&#xff1a;“在HTTP请求的表单数据中&#xff0c;隐藏着一座宝藏&#xff0c;等待勇敢的冒险者前来寻找。” 你知道&#xff0c;这封信正是冲着你来的&#xff01;今天&#xff0c;我们将使用Go语言作为我们的…

VMware17Pro虚拟机安装Linux CentOS 7.9(龙蜥)教程(超详细)

目录 1. 前言2. 下载所需文件3. 安装VMware3.1 安装3.2 启动并查看版本信息3.3 虚拟机默认位置配置 4. 安装Linux4.1 新建虚拟机4.2 安装操作系统4.2.1 选择 ISO 映像文件4.2.2 开启虚拟机4.2.3 选择语言4.2.4 软件选择4.2.5 禁用KDUMP4.2.6 安装位置配置4.2.7 网络和主机名配置…

GBASE南大通用数据库分享访问多个数据库的 SQL 语句

您可跨数据库和跨数据库服务器实例运行下列 SQL 语句&#xff1a; • CREATE DATABASE • CREATE SYNONYM • CREATE VIEW • DATABASE • DELETE • DROP DATABASE • EXECUTE FUNCTION • EXECUTE PROCEDURE • INFO • INSERT • LOAD • LOCK TABLE • MERGE • SE…

web自动化测试的智能革命:AI如何推动软件质量保证的未来

首先这个标题不是我取的&#xff0c;是我喂了关键字让AI给取的&#xff0c;果然非常的标题党&#xff0c;让人印象深刻&#xff0c;另外题图也是AI自动生成的。 先简单回顾一下web自动化测试的一些发展阶段 QTP时代 很多年前QTP横空出世的时候&#xff0c;没有人会怀疑这种工…

java判断时间是否为节假日(或指定的日期),是的话返回true,否返回false

这个方法属实有点老套&#xff0c;先定义set&#xff0c;需要手动输入要判断的时间才行。 这个代码&#xff0c;就是输入一个日期&#xff0c;来判断这个日期是否为你指定的日期。如果是的话&#xff0c;返回true&#xff0c;否的话返回false。 代码&#xff1a; package Lx…

软考高级考完了,怎么评职称?

每年考试结束后&#xff0c;总有朋友问我&#xff0c;考完后怎么才能评上职称呢&#xff1f;获得证书就意味着获得了职称吗&#xff1f;让我们一起来看看具体情况吧&#xff01; 01\职称获取途径 获得职称可以通过认定、评审、国家统一考试(以考代评)、职业资格对应等多种方式…

轻松设置CentOS IP地址的最终指南:详细的分步说明

轻松设置CentOS IP地址的最终指南 一、引言二、准备工作三、手动设置IP地址四、自动分配IP地址(DHCP)五、使用网络管理工具设置IP地址5.1、使用nmtui工具进行图形化设置5.2、使用nmcli命令行工具进行设置 六、常见问题和解决方案七、总结 一、引言 CentOS操作系统是一种基于Li…

【华为OD机试真题2023CD卷 JAVAJS】电脑病毒感染

华为OD2023(C&D卷)机试题库全覆盖,刷题指南点这里 电脑病毒感染 知识点广搜 题目描述: 一个局域网内有很多台电脑,分别标注为0 - N-1的数字。相连接的电脑距离不一样,所以感染时间不一样,感染时间用t表示。 其中网络内一个电脑被病毒感染,其感染网络内所有的电脑需…

mysql怎么只允许指定IP访问

要查看MySQL数据库中连接成功的历史IP地址&#xff0c;你可以查询MySQL的日志文件或使用以下SQL查询来获取相关信息&#xff1a; 查看MySQL的日志文件&#xff1a; 打开MySQL配置文件&#xff0c;找到log-bin参数。该参数用于启用二进制日志&#xff08;Binary Logging&#x…

LLM(八)| Gemini语言能力深度观察

论文地址&#xff1a;https://simg.baai.ac.cn/paperfile/fc2138ce-cadb-4a36-b9f7-c4000dea3369.pdf 谷歌最近发布的Gemini系列模型是第一个在各种任务与OpenAI GPT系列相媲美的模型。在本文中&#xff0c;作者对Gemini的语言能力做了深入的探索&#xff0c;做出了两方面的贡献…

服务案例|CIS数据库故障问题

一、告警通知 12月20日凌晨&#xff0c;平台收到某三甲医院告警通知&#xff0c;显示核心业务CIS系统数据库tempdb实例日志文件剩余空间不足。 查看告警详情页&#xff0c;显示tempbd日志文件使用率在凌晨1:30后异常增高。 一个小tip tempdb是SQL Server实例的系统数据库&…

NC(65)元数据增加字段

以报销单主表er_bxzb表为例&#xff0c;增加15个字段字段以及两个其他业务所需字段 1、先在er_bxzb增加字段 增加字段 alter table er_bxzb add no_invoice char(1) default(N);alter table er_bxzb add is_enabled_taxation_cloud char(1) default(N);alter table er_bxzb a…

云服务器的优势

云服务器的优势 裸机云服务器&#xff0c;拥有物理机同样的性能和安全&#xff0c;也具有云主机的灵活和弹性。其最显著的优势在于&#xff0c;用户能够直接控制服务器及其资源&#xff0c;这一点与虚拟化云实例有明显区别&#xff0c;后者会将底层硬件操作对用户进行隐藏。此外…

《PySpark大数据分析实战》-20.NumPy介绍数组的生成

&#x1f4cb; 博主简介 &#x1f496; 作者简介&#xff1a;大家好&#xff0c;我是wux_labs。&#x1f61c; 热衷于各种主流技术&#xff0c;热爱数据科学、机器学习、云计算、人工智能。 通过了TiDB数据库专员&#xff08;PCTA&#xff09;、TiDB数据库专家&#xff08;PCTP…

原来count(*)是接口性能差的真凶

前言 最近我在公司优化过几个慢查询接口的性能&#xff0c;总结了一些心得体会拿出来跟大家一起分享一下&#xff0c;希望对你会有所帮助。 我们使用的数据库是Mysql8&#xff0c;使用的存储引擎是Innodb。这次优化除了优化索引之外&#xff0c;更多的是在优化count(*)。 通…

MySQL——进阶篇

二、进阶篇&#x1f6a9; 1. 存储引擎&#x1f346; 1.1 MSQL体系结构 连接层&#xff1a; 连接处理&#xff0c;连接认证&#xff0c;每个客户端的权限 服务层&#xff1a; 绝大部分核心功能&#xff0c;可跨存储引擎 可插拔存储引擎&#xff1a; 需要的时候可以添加或拔掉…