百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术资源 > 正文

常见跨域解决方案(一)

off999 2025-02-07 18:44 93 浏览 0 评论

什么是跨域

跨域是指一个域下的文档或脚本试图去请求另一个域下的资源,这里跨域是广义的。

广义的跨域:

1)资源跳转:A链接、重定向、表单提交

2)资源嵌入:

服务端返回如下(返回时即执行全局函数):

handleCallback({"status": true, "user": "admin"})

2、jquery ajax

$.ajax({
    url: 'http://www.tunan666.com:8080/login',
    type: 'get',
    dataType: 'jsonp',  // 请求方式为jsonp
    jsonpCallback: "handleCallback",    // 自定义回调函数名
    data: {}
});

3、vue.js

this.$http.jsonp('http://www.tunan666.com:8080/login', {
    params: {},
    jsonp: 'handleCallback'
}).then((res) => {
    console.log(res); 
})

4、后端node.js

var querystring = require('querystring');
var http = require('http');
var server = http.createServer();

server.on('request', function(req, res) {
    var params = qs.parse(req.url.split('?')[1]);
    var fn = params.callback;

    // jsonp返回设置
    res.writeHead(200, { 'Content-Type': 'text/javascript' });
    res.write(fn + '(' + JSON.stringify(params) + ')');

    res.end();
});

server.listen('8080');
console.log('Server is running at port 8080...');

jsonp虽然很简单,但是有如下缺点:

1)安全问题:请求代码中可能存在安全隐患

2)要确定jsonp请求是否失败并不容易

3)只能实现get一种请求

二、iframe跨域

1、document.domain + iframe 跨域

此方案仅限主域相同,子域不同的跨域应用场景。

实现原理:两个页面都通过js强制设置document.domain为基础主域,就实现了同域。

1)父窗口:(
http://www.tunan666.com/a.html)


2)子窗口:(
http://child.tunan666.com/b.html)

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页面所有对象。

1)a.html:(http://www.tunan666.com/a.html)


2)b.html:(http://www.tn666.com/b.html)


3)c.html:(http://www.tunan666.com/c.html)

3、window.name + iframe 跨域

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

通过iframe的src属性由外域转向本地域,跨域数据即由iframe的window.name从外域传递到本地域。这个就巧妙地绕过了浏览器的跨域访问限制,但同时它又是安全操作。

1)a.html:(http://www.tunan666.com/a.html)

var proxy = function(url, callback) {
    var state = 0;
    var iframe = document.createElement('iframe');

    // 加载跨域页面
    iframe.src = url;

    // onload事件会触发2次,第1次加载跨域页,并留存数据于window.name
    iframe.onload = function() {
        if (state === 1) {
            // 第2次onload(同域proxy页)成功后,读取同域window.name中数据
            callback(iframe.contentWindow.name);
            destoryFrame();


        } else if (state === 0) {
            // 第1次onload(跨域页)成功后,切换到同域代理页面
            iframe.contentWindow.location = 'http://www.tunan666.com/proxy.html';
            state = 1;
        }
    };

    document.body.appendChild(iframe);

    // 获取数据以后销毁这个iframe,释放内存;这也保证了安全(不被其他域frame js访问)
    function destoryFrame() {
        iframe.contentWindow.document.write('');
        iframe.contentWindow.close();
        document.body.removeChild(iframe);
    }
};

// 请求跨域b页面数据
proxy('http://www.tn666.com/b.html', function(data){
    alert(data);
});

2)proxy.html:(http://www.tunan666.com/proxy….

中间代理页,与a.html同域,内容为空即可。

3)b.html:(http://www.tn666.com/b.html)

三、postMessage跨域

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

1)页面和其打开的新窗口的数据传递

2)多窗口之间消息传递

3)页面与嵌套的iframe消息传递

4)上面三个场景的跨域数据传递

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

data:html5规范支持任意基本类型或可复制的对象,但部分浏览器只支持字符串,所以传参时最好用JSON.stringify()序列化。

origin:协议+主机+端口号,也可以设置为"*",表示可以传递给任意窗口,如果要指定和当前窗口同源的话设置为"/"。

1、a.html:(
http://www.tunan666.com/a.html)


2、b.html:(
http://www.tn666.com/b.html)


下一篇文章介绍剩下的几种方法:

4、跨域资源共享(CORS)

5、nginx代理跨域

6、nodejs中间件代理跨域

7、WebSocket协议跨域


敬请期待~

相关推荐

斗地主网页版(欢乐斗地主网页版)

1.是两个版本在运行2.这是因为电脑欢乐斗地主可以有不同的版本,每个版本可能有不同的功能或者设计,所以可以同时存在多个版本在运行。3.这种情况下,可能是为了满足不同用户的需求或者提供不同的游戏体...

比早游戏更好的平台(早游戏相似的游戏盒)

你好,这边推荐你用及时用车,及时用车这款app目前挂靠在高的旗下平台。双方正在推出免佣活动。早高峰7点~9点这个时间段及时用车,这边是免收佣金的,乘客付多少,司机得多少,可以轻松跑出高额流水。其次,中...

qq下载中心(qq下载.cn)

可以通过解除保护模式页面,查看QQ帐号进入保护模式的原因,及获取恢复QQ帐号正常使用的方法。1.可以在realme手机中出场自带的软件商店中搜索游戏中心下载安装即可。2.可在设置-应用-系统可卸载应...

qq轻聊版旧版本可登录(qq轻聊版旧版本下载2018)
qq轻聊版旧版本可登录(qq轻聊版旧版本下载2018)

楼主您好!①先登录正式版,在设置里面关闭设备安全锁,退出账号②下载轻聊版进行登录,重新开启安全锁主要是QQ轻聊版比较适合想我这样的学生党,这样能够安心学习还能接收消息,内存也比较少电脑版的有的可以,有的就不行手机版的大部分是不可以的,会提...

2026-01-24 03:15 off999

诺基亚老款手机(诺基亚5g手机新款上市)

1999年上市3210(GSM)6150(GSM)8810(GSM)1998年上市1610(GSM)2110(GSM)232(其他)3810(GSM)5110(GSM)6110(GSM)8110+(G...

模拟经营开店的游戏(模拟经营开店的游戏大全)

奇趣多多的餐厅经营玩法让每一个玩家都能够在游戏之中通过经营来赚取财富,每一天都会有新的惊喜等待着大家,而且每一种玩法都会给玩家带来福利,让你能够通过不断的挑战来赚取到高额的红包奖励,而且游戏之中设计有...

精准客户电话号码资源(精准客户电话号码渠道)

微信不同加人方式有不同的限制:1、附近人功能。加人上限15人/天,频率3次/天,间隔时间1-2小时。2、摇一摇功能。加人上限15人/天,频率3次/天,间隔时间1-2小时。3、通讯录搜索功能。加人上限6...

qq下载安装2025(qq下载安装2024最新版免费)
qq下载安装2025(qq下载安装2024最新版免费)

丰田威兰达安装音乐需要先确定音响系统类型,再选择合适的音源设备,如U盘、蓝牙连接或AUX线连线方式等。接下来插上音源设备,通过车内多媒体系统进行操作,如选择音乐播放、调节音量等。同时,还需要注意音源设备的存储格式和音乐文件的格式,以保证能够...

2026-01-24 02:15 off999

上网加速器(上网加速器试用)

有提高网络加速器(Webaccelerator)是上网加速软件,由用户终端软件以及加速服务器构成,具有高性能的网络优化网关,通过改良HTTP协议与文字、影像压缩技术,大幅改善网页浏览速度和访问速...

有道翻译官下载(有道翻译官app官方下载)

首先打开手机,我们在手机桌面上找到网易有道词典app,点击该软件就可以进入到主界面,.2进入到软件主界面后,我们在界面底部找到“听力”选项,点击该选项就可以跳转到听力页面。.3接着在听力页面中,我们在...

英雄联盟官网下载安装(英雄联盟 官方下载)

以下说英雄联盟的下载方法:1.打开浏览器,并进入《英雄联盟》的官方网站。官方网站通常为"leagueoflegends.com"。2.在官方网站的首页或下载页面,找到适用于你的操作...

win10系统下载纯净版(windows10下载纯净版)

  一、所需工具  1、大白菜U盘:大白菜u盘制作教程  2、操作系统:纯净版win7系统  3、启动设置:怎么设置开机从U盘启动  4、分区教程:大白菜u盘装系统分区教程  二、电脑装纯净版系统步骤...

北斗导航免费下载(北斗导航app下载 官方正式版)

北斗导航不需要下载。北斗导航是我国自主研发建设的卫星导航系统,是世界上第三个全球卫星导航系统,是联合国卫星导航委员会认证的卫星导航供应商。可为全球用户提供全天候、全天时、高精度的定位、导航和授时服务的...

百度翻译下载(百度翻译下载安装)

百度翻译扫一扫的入口在百度首页,打开百度,在对话框右边有个相机的图标,打开相机,下面有扫一扫功能,把不会读的英文,用百度扫一扫功能,就可以进行中英文翻译了。你说的这四个翻译,有三个翻译源于国内自己开发...

扫一扫识别英文(扫一扫识别英文怎么用)

一般来说只要用智能手机就可以了。用微信去扫上面的二维码,然后进行听读就可以了,不过建议买一个耳机带上因为这样听的效果比较好,耳机的音质比外放要好一些,听的也比较清晰,以后英语考四六级的话,也是需要...

取消回复欢迎 发表评论: