项目中常遇到的几种跨域方案(代码片段)

onesea onesea     2022-12-04     700

关键词:

1.jsonp

  jsonp属于最老的一种跨域方案了,我在现在的项目中已经很少见到

技术图片
$(‘#btn‘).click(function()
    var frame = document.createElement(‘script‘);            
        frame.src = ‘http://localhost:3000/article-list?name=leo&age=30&callback=func‘;
    $(‘body‘).append(frame);
)

function func(res) 
  console.log(res); 
技术图片

可以看到,让我们点击按钮的时候,创建了一个script标签(即会发送一个get请求到src指向的地址),src地址是"localhost:3000/article-list",这个src地址,就是我们请求的服务端接口。注意,这里我们有个参数callback,callback参数就是核心所在。

为什么要定义callback呢?首先我们知道,这个get请求已经被发出去了,那么我们如何接口请求回来的数据呢,callback=func则可以帮我们做这件事。callback参数定义的方法是需要前后端定义好,整个过程就类似于前端声明好一个函数,后端返回执行函数。

 

2.cors

  服务器端对于CORS的支持,主要就是通过设置Access-Control-Allow-Origin来进行的。如果浏览器检测到相应的设置,就可以允许Ajax进行跨域的访问。

CORS需要浏览器和服务器同时支持。目前,所有浏览器都支持该功能,IE浏览器不能低于IE10。

整个CORS通信过程,都是浏览器自动完成,不需要用户参与。对于开发者来说,CORS通信与同源的AJAX通信没有差别,代码完全一样。

浏览器一旦发现AJAX请求跨源,就会自动添加一些附加的头信息,有时还会多出一次附加的请求,但用户不会有感觉。 因此,实现CORS通信的关键是服务器。只要服务器实现了CORS接口,就可以跨源通信。

技术图片
一旦服务器通过了"预检"请求,以后每次浏览器正常的CORS请求,就都跟简单请求一样,会有一个Origin头信息字段。服务器的回应,也都会有一个Access-Control-Allow-Origin头信息字段。
下面是"预检"请求之后,浏览器的正常CORS请求。

PUT /cors HTTP/1.1
Origin: http://api.bob.com
Host: api.alice.com
X-Custom-Header: value
Accept-Language: en-US
Connection: keep-alive
User-Agent: Mozilla/5.0...
上面头信息的Origin字段是浏览器自动添加的。
下面是服务器正常的回应。

Access-Control-Allow-Origin: http://api.bob.com
Content-Type: text/html; charset=utf-8
上面头信息中,Access-Control-Allow-Origin字段是每次回应都必定包含的。
技术图片


CORS与JSONP的使用目的相同,但是比JSONP更强大。
JSONP只支持GET请求,CORS支持所有类型的HTTP请求。JSONP的优势在于支持老式浏览器,以及可以向不支持CORS的网站请求数据。

 

3.postMessage

  window对象新增了一个window.postMessage方法,允许跨窗口通信,不论这两个窗口是否同源。目前IE8+、FireFox、Chrome、Opera等浏览器都已经支持window.postMessage方法。

常用来解决下面三种情况出现的跨域问题:

a.页面和其打开的新窗口的数据传递

b.多窗口之间消息传递

c.页面与嵌套的iframe消息传递

语法:

otherWindow.postMessage(message, targetOrigin, [transfer]);

otherWindow其他窗口的一个引用,比如iframe的contentWindow属性、执行window.open返回的窗口对象、或者是命名过或数值索引的window.frames

message将要发送到其他 window的数据。它将会被结构化克隆算法序列化。这意味着你可以不受什么限制的将数据对象安全的传送给目标窗口而无需自己序列化。

targetOrigin通过窗口的origin属性来指定哪些窗口能接收到消息事件,其值可以是字符串"*"(表示无限制)或者一个URI。在发送消息的时候,如果目标窗口的协议、主机地址或端口这三者的任意一项不匹配targetOrigin提供的值,那么消息就不会被发送;只有三者完全匹配,消息才会被发送。这个机制用来控制消息可以发送到哪些窗口

transfer 可选参数,是一串和message 同时传递的 Transferable 对象. 这些对象的所有权将被转移给消息的接收方,而发送一方将不再保有所有权。

例1:

技术图片
//  http://test.com/index.html中

<div>
    <iframe id="child" src="http://lsLib.com/lsLib.html"></iframe>
</div>

//通过postMessage()方法向跨域的iframe页面http://lsLib.com/lsLib.html传递消息

window.onload=function()
    window.frames[0].postMessage(‘getcolor‘,‘http://lslib.com‘);


//  http://lslib.com/lslib.html中
//接收消息,并把当前颜色发送给主页面呢 window.addEventListener(‘message‘,function(e)
   console.log(e.data); if(e.source!=window.parent) return; var color=container.style.backgroundColor; window.parent.postMessage(color,‘*‘); ,false);
技术图片

例2(txb商家端):

技术图片
//发送(preview.html)
var docWindow = document.getElementById(‘h5-container‘).contentWindow; if (!!docWindow) docWindow.postMessage( type: ‘flip‘, pageIndex: pageIndex , ‘*‘); //接受(h5-formwork.js) window.addEventListener("message", function receiveMessage(evt) var data = evt.data; !!data ? typeof evt.data === ‘string‘ ? JSON.parse(data) : data : ; if (data.type === ‘flip‘) return Utils.emit(‘flip‘, data.pageIndex); return Utils.emit(data.type, data); , false);
技术图片

4.document.domain

5.window.name

6.location.hash

7.http-proxy

8.nginx

9.websocket

后面的几种跨域可参考:https://blog.csdn.net/qq_17175013/article/details/89115804

项目中经常遇到的跨域请求的几种方法

什么是跨域JSONPproxy代理corsxdr 关于跨域无非就是jsonp和iframe,随着跨域请求的应用越来越多,W3C提供了跨域请求的标准方案(Cross-OriginResourceSharing)。IE8、Firefox3.5及其以后的版本、Chrome浏览器、Safari4等已经实现了Cross-OriginRes... 查看详情

web跨域解决方案1

...结摘要:跨域问题,无论是面试还是平时的工作中,都会遇到,本文总结处理跨域问题的几种方法以及其原理,也让自己搞懂这方面的知识,走起。 回到顶部什么是跨域     在JavaScript中,有一个很重要的安全性... 查看详情

三种跨域解决方案(代码片段)

当前端页面与后台运行在不同的服务器时,就必定会出现跨域这一问题,本篇简单介绍解决跨域的三种方案,部分代码截图如下,仅供参考:Nginx代理这种方式比较简单,将A应用和B应用都通过一个统一的地址进行转发,这样就... 查看详情

js中常遇到切割截取字符串的几种方法(代码片段)

切割截取字符串的几种方法1、split()方法用于把一个字符串分割成字符串数组;stringObject.split(str,length)varstr="123,456,789";console.log(str.split(''));//["1","2","3",",","4","5","6",",... 查看详情

可能是最好的跨域解决方案了(代码片段)

...不看了不看了🤣别走...我尽量用最简单的方式将常见的几种跨域解决方案给大家阐释清楚,相信认真看完本文,以后不管是作为受试者还是面试官,对于这块的知识都能够游刃有 查看详情

关于跨域问题的几种解决方案(代码片段)

 1.什么是跨域?跨域:指的是浏览器不能执行其他网站的脚本。它是由浏览器的同源策略造成的,是浏览器对javascript施加的安全限制。例如:a页面想获取b页面资源,如果a、b页面的协议、域名、端口、子域名不同,所进行... 查看详情

springboot配置cors跨域的几种方法(代码片段)

作记录用请参考https://blog.csdn.net/lizc_lizc/article/details/81155895 第一种:  在每个controller上添加 @CrossOrigin第二种:使用拦截器  1、方法一@ConfigurationpublicclassCorsConfig@BeanpublicCorsFiltercorsFilter()final 查看详情

跨域解决的几种方案

前两天碰到一个跨域问题的处理,使用jsonp可以解决。(http://www.jb51.net/article/57889.htm)最近再整理了一下:1.jsonp。  ajax请求,dataType为jsonp。这种形式需要请求在服务端调整为返回callback([json-object])的形式。如果服务端返... 查看详情

九种跨域方式实现原理(完整版)(代码片段)

...端数据交互经常会碰到请求跨域,什么是跨域,以及有哪几种跨域方式,这是本文要探讨的内容。本文完整的源代码请猛戳GitHub博客,纸上得来终觉浅,建议动手敲敲代码一、什么是跨域?1.什么是同源策略及其限制内容?同源... 查看详情

详解cors跨域的几种不同实现方式(代码片段)

CORS定义CORS是一个W3C标准,全称是"跨域资源共享"(Cross-originresourcesharing),它允许浏览器向跨源服务器,发出XMLHttpRequest请求,从而克服了AJAX只能同源使用的限制。提供了Web服务从不同域传来沙盒脚本的方法,以避开浏览器的... 查看详情

vue开发环境和生产环境里面解决跨域的几种方法(代码片段)

  跨域指浏览器不允许当前页面的所在的源去请求另一个源的数据。源指协议,端口,域名。只要这个3个中有一个不同就是跨域。这里列举一个经典的列子:#协议跨域http://a.baidu.com访问https://a.baidu.com;#端口跨域http://a.ba... 查看详情

几种跨域的方法

p.p1{margin:0.0px0.0px0.0px0.0px;font:15.0pxConsolas}完整的http请求过程1、建立TCP连接2、WEB浏览器向WEB服务器发送请求命令3、WEB浏览器发送请求头信息(头信息:客服端环境信息,身份验证信息等)4、WEB服务器应答5、WEB服务器发送应答头... 查看详情

tomcat部署项目的几种方式(代码片段)

...问题:1.黑窗口一闪而过2.启动报错3.关闭4.配置部署项目的方式静态项目和动态项目:一、Tomcat:web服务器软件下载:http://tomcat.apache.org/安装:解压压缩包即可。注意:安装目录建议不要有中文和空格卸载... 查看详情

springboot跨域处理的几种方式(代码片段)

作者简介作者名:编程界小明哥简介:CSDN博客专家,从事软件开发多年,精通Java、JavaScript,博主也是从零开始一步步把学习成长、深知学习和积累的重要性,喜欢跟广大ADC一起打野升级,欢迎您关注&... 查看详情

前端跨域问题的几种解决方案

前端跨域问题一:同源策略  1.what‘sthis    所谓同源是指,域名,协议,端口相同。当浏览器运行一个JS脚本时会进行同源检测,如果不同源是不能执行的。  2.源继承    来自about:blank,javascript:和data:URLs中的内... 查看详情

最常见的六种跨域解决方案(代码片段)

目录:前言:什么是跨域?JSONPCORS搭建Node代理服务器Nginx反向代理postMessageWebsocket总结前言:什么是跨域?跨域就是当在页面上发送ajax请求时,由于浏览器同源策略的限制,要求当前页面和服务端必须... 查看详情

text分布式唯一id的几种生成方案(代码片段)

查看详情

九种跨域方式实现原理(完整版)(代码片段)

...互经常会碰到请求跨域,什么是跨域,以及有哪几种跨域方式,这是本文要探讨的内容。一、什么是跨域?1.什么是同源策略及其限制内容?同源策略是一种约定,它是浏览器最核心也最基本的安全功能... 查看详情