首页 > 其他分享 >60.如何解决跨域问题

60.如何解决跨域问题

时间:2023-07-14 23:25:28浏览次数:48  
标签:浏览器 跨域 60 域名 iframe 解决 请求 页面

60. 如何解决跨域问题?

相关知识点:

    1. 通过 jsonp 跨域
    1. document.domain + iframe 跨域
    1. location.hash + iframe
    1. window.name + iframe 跨域
    1. postMessage 跨域
    1. 跨域资源共享(CORS)
    1. nginx 代理跨域
    1. nodejs 中间件代理跨域
    1. WebSocket 协议跨域

回答:

解决跨域的方法我们可以根据我们想要实现的目的来划分。

首先我们如果只是想要实现主域名下的不同子域名的跨域操作,我们可以使用设置 document.domain 来解决。

(1)将 document.domain 设置为主域名,来实现相同子域名的跨域操作,这个时候主域名下的 cookie 就能够被子域名所访问。同时如果文档中含有主域名相同,子域名不同的 iframe 的话,我们也可以对这个 iframe 进行操作。

如果是想要解决不同跨域窗口间的通信问题,比如说一个页面想要和页面的中的不同源的 iframe 进行通信的问题,我们可以使用 location.hash 或者 window.name 或者 postMessage 来解决。

(2)使用 location.hash 的方法,我们可以在主页面动态的修改 iframe 窗口的 hash 值,然后在 iframe 窗口里实现监听函数来实现这样一个单向的通信。因为在 iframe 是没有办法访问到不同源的父级窗口的,所以我们不能直接修改父级窗口的 hash 值来实现通信,我们可以在 iframe 中再加入一个 iframe ,这个 iframe 的内容是和父级页面同源的,所以我们可以 window.parent.parent 来修改最顶级页面的 src,以此来实现双向通信。

(3)使用 window.name 的方法,主要是基于同一个窗口中设置了 window.name 后不同源的页面也可以访问,所以不同源的子页面可以首先在 window.name 中写入数据,然后跳转到一个和父级同源的页面。这个时候级页面就可以访问同源的子页面中 window.name 中的数据了,这种方式的好处是可以传输的数据量大。

(4)使用 postMessage 来解决的方法,这是一个 h5 中新增的一个 api。通过它我们可以实现多窗口间的信息传递,通过获取到指定窗口的引用,然后调用 postMessage 来发送信息,在窗口中我们通过对 message 信息的监听来接收信息,以此来实现不同源间的信息交换。

如果是像解决 ajax 无法提交跨域请求的问题,我们可以使用 jsonp、cors、websocket 协议、服务器代理来解决问题。

(5)使用 jsonp 来实现跨域请求,它的主要原理是通过动态构建 script  标签来实现跨域请求,因为浏览器对 script 标签的引入没有跨域的访问限制 。通过在请求的 url 后指定一个回调函数,然后服务器在返回数据的时候,构建一个 json 数据的包装,这个包装就是回调函数,然后返回给前端,前端接收到数据后,因为请求的是脚本文件,所以会直接执行,这样我们先前定义好的回调函数就可以被调用,从而实现了跨域请求的处理。这种方式只能用于 get 请求。

(6)使用 CORS 的方式,CORS 是一个 W3C 标准,全称是"跨域资源共享"。CORS 需要浏览器和服务器同时支持。目前,所有浏览器都支持该功能,因此我们只需要在服务器端配置就行。浏览器将 CORS 请求分成两类:简单请求和非简单请求。对于简单请求,浏览器直接发出 CORS 请求。具体来说,就是会在头信息之中,增加一个 Origin 字段。Origin 字段用来说明本次请求来自哪个源。服务器根据这个值,决定是否同意这次请求。对于如果 Origin 指定的源,不在许可范围内,服务器会返回一个正常的 HTTP 回应。浏览器发现,这个回应的头信息没有包含 Access-Control-Allow-Origin 字段,就知道出错了,从而抛出一个错误,ajax 不会收到响应信息。如果成功的话会包含一些以 Access-Control- 开头的字段。

非简单请求,浏览器会先发出一次预检请求,来判断该域名是否在服务器的白名单中,如果收到肯定回复后才会发起请求。

(7)使用 websocket 协议,这个协议没有同源限制。

(8)使用服务器来代理跨域的访问请求,就是有跨域的请求操作时发送请求给后端,让后端代为请求,然后最后将获取的结果发返回。

详细资料可以参考:
《前端常见跨域解决方案(全)》
《浏览器同源政策及其规避方法》
《跨域,你需要知道的全在这里》
《为什么 form 表单提交没有跨域问题,但 ajax 提交有跨域问题?》

标签:浏览器,跨域,60,域名,iframe,解决,请求,页面
From: https://www.cnblogs.com/zhuoss/p/17555319.html

相关文章

  • 99.为什么0.10.20.3如何解决这个问题
    99.为什么0.1+0.2!=0.3?如何解决这个问题?当计算机计算0.1+0.2的时候,实际上计算的是这两个数字在计算机里所存储的二进制,0.1和0.2在转换为二进制表示的时候会出现位数无限循环的情况。js中是以64位双精度格式来存储数字的,只有53位的有效数字,超过这个长度的位数会被......
  • 解决浏览器自动将http跳转至https导致无法访问的问题
      最近在宝塔面板申请免费的SSL证书后,部署证书的80端口下的网站可以通过https正常访问,但其他未部署证书的端口也被强制跳转至https请求,导致浏览器提示不安全从而无法访问。宝塔的8888端口也不能访问,当时那是一个慌,当我尝试了各种方法,如重新放行443端口、重新配置nginx反向代理、......
  • windows下用mysqldump导出数据库中文乱码的解决方案
    解决方案是从这篇文章得到的启发:http://www.pcxitongcheng.com/server/anz/2022-12-06/33622.html先去mysql里确认字符编码是utf8:showvariableslike'%char%'主要确认character_set_results。先创建好sql文件,比如d:\backup.sql然后备份的时候用--result-file=指定刚创建的文......
  • typora上传博客园图片解决方案
    typora上传博客园图片解决方案下载地址:Download.NET7.0SDK(v7.0.306)-Windowsx64Installer(microsoft.com)注意:typora文件不要有中文,会报错!!!绑定密码的时候用的是令牌,不然报错!!!1.安装:dotnet,必须安装5.0版本,先安装了7.0报错,后提示安装5.0//管理员安装dotnet-cnbl......
  • Nuke导出视频缺失 H.246格式 的解决办法
    同事在使用Nuke导出视频时报错,报错提示:缺失H.246格式后来经过我的研究发现,QuicktimePlayer在标准安装时,默认不关联一些格式(具体是哪些格式不清楚)QuicktimePlayer在安装过程中,不要选择标准安装,应该是选择自定义安装,然后在安装的过程中,要完全安装这样就不会报错了。 p......
  • PS安装插件提示无法加载扩展未正确签署 的解决办法
    PS安装插件提示无法加载扩展未正确签署解决方式 win系统: 1、打开“运行”窗口(点击电脑左下角“开始”菜单,从打开的菜单中依次点击“所有程序”->“附件”->“运行”来打开“运行”),或者快捷键“win+R”来打开“运行”窗口,打开之后输入"regedit"确定。2、打开如图注册表,找到......
  • BrowserRouter刷新404解决方案
    1、本地开发环境在js脚本命令里加上--history-api-fallback"scripts":{"serve":"webpackserve--configwebpack.dev.js--history-api-fallback"} 2、生产环境,可以修改 nglnx配置:server{listenXXXX;//端口号server_nameXXX.XXX.XXX.XXX;......
  • java 跨域
       ......
  • mongodb报错Sort exceeded memory limit of 104857600 bytes
    mongodb运行过程中,遇到错误信息:2023-07-14T09:29:33.853ERRFailedtoQueryBsPoolUnivStaterror="(QueryExceededMemoryLimitNoDiskUseAllowed)Executorerrorduringfindcommand::causedby::Sortexceededmemorylimitof104857600bytes,butdidnotoptinto......
  • 【全流程管理解决方案】奥威BI金蝶云星空SaaS版:重新定义企业管控
    金蝶云星空是一套全面覆盖供应链、采购、生产、销售、财务等业务流程,实现了全链条的闭环管理的综合性管理软件。但在云时代,仅仅覆盖业务流程还不够,还需要有一套全流程管理解决方案,实现对全业务流程数据的深度挖掘,为运营决策提供支持。奥威BI金蝶云星空SaaS版,一套覆盖全流程业务管理......