目录

引言

一、JSONP 跨域

二、 iframe跨域

2.1 window.name + iframe跨域

2.2 location.hash + iframe跨域

2.3 document.domain + iframe跨域

三、postMessage 跨域

四、nginx反向代理跨域

五、nodejs 中间件代理跨域

六、前端正向代理跨域

七、WebSocket协议跨域

八、通用方法(仅限公司内网使用)


引言

上文中提到了cors 解决跨域的方法,除此之外还有很多。

一、JSONP 跨域

        jsonp的原理就是利用 <script> 标签没有跨域限制,通过<script>标签src属性,发送带有callback参数的GET请求,服务端将接口返回数据拼凑到callback函数中,返回给浏览器,浏览器解析执行,从而前端拿到callback函数返回的数据。

JSONP的缺点:

  • 具有局限性, 仅支持get方法
  • 不安全,可能会遭受XSS攻击

二、 iframe跨域

2.1 window.name + iframe跨域

window.name属性的独特之处:name值在不同的页面(甚至不同域名)加载后依旧存在,并且可以支持大小2MB的 name 值。

2.2 location.hash + iframe跨域

a欲与b跨域相互通信,通过中间页c来实现。 三个页面,不同域之间利用iframe的location.hash传值,相同域之间直接js访问来通信。

实现:A域:a.html -> B域:b.html -> A域:c.html,a与b不同域只能通过hash值单向通信,b与c也不同域也只能单向通信,但c与a同域,所以c可通过parent.parent访问a页面所有对象。

2.3 document.domain + iframe跨域

此方案仅限主域相同,子域不同的跨域应用场景。实现原理:两个页面都通过js强制设置document.domain为基础主域,实现同域。

三、postMessage 跨域

postMessage是HTML5 XMLHttpRequest Level 2中的API,且是为数不多可以跨域操作的window属性之一,它可用于解决以下方面的问题的跨域:

  • 页面和其打开的新窗口的数据传递
  • 多窗口之间消息传递
  • 页面与嵌套的iframe消息传递

用法:postMessage(data,origin)方法接受两个参数:

  • data: html5规范支持任意基本类型或可复制的对象,但部分浏览器只支持字符串,所以传参时最好用JSON.stringify()序列化。
  • origin: 协议+主机+端口号,也可以设置为"*",表示可以传递给任意窗口,如果要指定和当前窗口同源的话设置为"/"。

四、nginx反向代理跨域

Nginx 是一款轻量级的 Web 服务器,也可以用于反向代理、负载平衡和 HTTP 缓存等。Nginx 使用异步事件驱动的方法来处理请求,是一款面向性能设计的 HTTP 服务器。通过Nginx配置一个代理服务器域名与domain1相同,端口不同)做跳板机,反向代理访问domain2接口,并且可以顺便修改cookie中domain信息,方便当前域cookie写入,实现跨域访问。

五、nodejs 中间件代理跨域

通过启一个代理服务器,实现数据的转发,也可以通过设置cookieDomainRewrite参数修改响应头中cookie中域名,实现当前域的cookie写入,方便接口登录认证。

六、前端正向代理跨域

与反向代理跨域相对,在客户端设置了一个代理服务器,并且指定目标服务器,之后代理服务器向目标服务器转交请求并将获得的内容发送给客户端。本质上起到了对服务器隐藏客户端的目的。一般新建一个setupProxy.js进行配置

const proxy = require('http-proxy-middleware');module.exports = function (app) {app.use( proxy ('/api', {target: url, /*这里写自己的代理地址*/changeOrigin: true,ws: true,pathRewrite: {'^/api': ''},}));
};

七、WebSocket协议跨域

WebSocket protocol是HTML5一种新的协议。它实现了浏览器与服务器全双工通信,同时允许跨域通讯,是server push技术的一种很好的实现。

// 前端代码<div>user input:<input type="text"></div>
<script src="https://cdn.bootcss.com/socket.io/2.2.0/socket.io.js"></script>
<script>
var socket = io('http://www.domain2.com:8080');
// 连接成功处理
socket.on('connect', function() {// 监听服务端消息socket.on('message', function(msg) {console.log('data from server: ---> ' + msg); });// 监听服务端关闭socket.on('disconnect', function() { console.log('Server socket has closed.'); });
});
document.getElementsByTagName('input')[0].onblur = function() {socket.send(this.value);
};
</script>
// 后台代码var http = require('http');
var socket = require('socket.io');
// 启http服务
var server = http.createServer(function(req, res) {res.writeHead(200, {'Content-type': 'text/html'});res.end();
});
server.listen('8080');
console.log('Server is running at port 8080...');
// 监听socket连接
socket.listen(server).on('connection', function(client) {// 接收信息client.on('message', function(msg) {client.send('hello:' + msg);console.log('data from client: ---> ' + msg);});// 断开处理client.on('disconnect', function() {console.log('Client socket has closed.'); });
});

八、通用方法(仅限公司内网使用)

1. 在chrome://flags里搜索'same-site', 将下图 ‘SameSite by default cookies’ 项设置为disabled,重启chrome即可:

注意:浏览器的 Cookie 新增加了一个SameSite属性,用来防止 CSRF 攻击和用户追踪。

它可以设置三个值:

  • Strict
  • Lax
  • None

管控程度依次降低

2. 如果搜不到这个配置,说明当前chrome版本太高了,请参看下面的解决方案。

2.1 本地配置代理,将本地ip指向域名。(优点:不需要动chrome;缺点:配置有成本,和环境有耦合)

2.2 下载低版本的chrome,如 86.0.4240.75,下载地址。(优点:可以永久性避开问题;缺点:无法再体验新版chrome的功能)。安装后执行命令,禁止更新:

cd ~/Library/Google
sudo chown root:wheel GoogleSoftwareUpdate

解决跨域的8种最常用方法(附终极通用大招)相关推荐

  1. vue开发环境和生产环境里面解决跨域的几种方法

    vue开发环境和生产环境里面解决跨域的几种方法 参考文章: (1)vue开发环境和生产环境里面解决跨域的几种方法 (2)https://www.cnblogs.com/pass245939319/p/ ...

  2. Springboot 解决跨域的四种姿势

    Springboot 解决跨域的四种姿势 姿势一 实现WebMvcConfigurer#addCorsMappings的方法 import org.springframework.context.an ...

  3. SpringBoot解决跨域的5种方式

    本文来说下SpringBoot中实现跨域的5种方式. 文章目录 什么是跨域 java解决CORS跨域请求的方式 返回新的CorsFilter(全局跨域) 重写WebMvcConfigurer(全局跨域 ...

  4. 什么是同源策略及解决跨域的三种方式

    同源策略 1.1.1 所谓同源是指"协议+域名+端口"三者相同,即便两个不同的域名指向同一个 ip 地址,也非同源.同源策略/SOP(Same origin policy)是一种约 ...

  5. springboot项目解决跨域的几种方式

    跨域资源共享(CORS):通过修改Http协议header的方式,实现跨域.说的简单点就是,通过设置HTTP的响应头信息,告知浏览器哪些情况在不符合同源策略的条件下也可以跨域访问,浏览器通过解析Htt ...

  6. CORS解决跨域的几种实现方式

    目录 一.什么是跨域 二.同源策略 非同源限制 三.跨域的解决办法 CORS 3.1.两种请求 3.1.1.简单请求 3.1.2.非简单请求 3.2.CORS常用解决跨域的方法 3.2.1.HttpS ...

  7. 什么是同源策略?解决跨域的三种方法?

    1.同源策略 同源策略是一种约定和规范好的安全策略,是浏览器最核心最基本的安全保障.同源政策的目的,是为了保证用户信息的安全,防止恶意的网站窃取数据. 满足的条件: (1)协议要相同:HTTP.HTT ...

  8. 前端解决跨域的九种方法

    什么是跨域? 跨域是指一个域下的文档或脚本试图去请求另一个域下的资源,这里跨域是广义的. 广义的跨域: 1.资源跳转:A链接.重定向.表单提交 2.资源嵌入: <link>.<scr ...

  9. SpringMVC解决跨域的两种方案

    1. 什么是跨域 2. 跨域的应用情景 3. 通过注解的方式允许跨域 4. 通过配置文件的方式允许跨域 1. 什么是跨域 跨域,即跨站HTTP请求(Cross-site HTTP request),指 ...

最新文章

  1. redis bitmap
  2. Unity3D官网教程:Roll-A-Ball实现C#代码,5.X版
  3. 未发现数据源名称并且未指定默认驱动程序_10个有用的HTML5功能,您可能未使用
  4. 网和aoe网的区别_欧哲门窗的金刚网和其他品牌的有什么区别?
  5. 常用的排序算法总结(一)
  6. --Symantec AntiVirus9.0--网上已很难寻的经典防病毒软件
  7. sqlalchemy 聚合
  8. P2325 [SCOI2005]王室联邦
  9. 给Ubuntu 13.04换源 软件源、更新源
  10. 联想台式主机拆机教程_联想r400拆机教程 拆解电脑没那么难
  11. 如何装计算机网络驱动,网卡驱动怎么安装,手把手教你电脑网卡驱动怎么安装...
  12. Win10 如何删除系统盘大文件hiberfil.sys
  13. 【机器学习】【决策树】ID3算法,Python代码实现生成决策树的系统
  14. PHP给微信二维码 添加背景和昵称 ,微信带参数海报跨坑记录。
  15. [唐诗]杳杳寒山道-寒山
  16. 移动端开发——flex布局
  17. 线上线下模式暗藏专利风险?
  18. 一直被模仿从未被超越的AWS为什么这么强?
  19. 南大软工考研参考书目
  20. 如何更好的建设标准化数字化智慧工地?

热门文章

  1. 人人都是艺术家!谈谈那些奇怪的字符
  2. 图像边缘检测(canny检测附完整代码与输出样例)
  3. html如何用百分比绝对定位,CSS相对定位和绝对定位使用百分比的计算逻辑
  4. MachineKey 操作 之 应用集群中SSO应用生成MachineKey
  5. 微信小程序实现倒计时功能
  6. CSS 中 !important 的用法
  7. 和光同尘宝库:QQ空间如何截流?
  8. 阿里云国际站版游戏盾产品详细解析以及防御问题介绍
  9. 苹果为给新品让路!iPhone XS大幅降价加速清仓,你会考虑入手吗
  10. Cesium 含水三维管道网络模拟