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

常见跨域解决方案(一)

off999 2025-02-07 18:44 88 浏览 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协议跨域


敬请期待~

相关推荐

win10wifi驱动程序下载(win10wifi驱动官方下载)

win10安装wifi驱动方法如下1/4同时按住Windows键和R键,打开运行框。键入devmgmt.msc,然后按确定打开设备管理器。   2/4展开"网...

鼠标禁用一键解除(鼠标禁用一键解除怎么恢复)
  • 鼠标禁用一键解除(鼠标禁用一键解除怎么恢复)
  • 鼠标禁用一键解除(鼠标禁用一键解除怎么恢复)
  • 鼠标禁用一键解除(鼠标禁用一键解除怎么恢复)
  • 鼠标禁用一键解除(鼠标禁用一键解除怎么恢复)
为什么电脑蓝屏了(电脑为什么蓝屏怎么解决)

1、电脑使用过度,温度过高过度使用电脑会导致电脑硬件发生损坏,系统超载,内部运算过多,cpu温度急剧升高,会发生系统错误。建议更换散热系统,更新“小风扇”设备,并合理使用电脑。2、内存条灰尘积压,或...

电脑耳机没声音(电脑耳机没声音怎么解决)

1、可能是耳机没有完全插入电脑音频接口,重新插入再确认是否有声音。2、可能是耳机差错音频接口(插成麦克风接口),更换接口再插入确认。为什么耳机连接电脑没有声音耳机连接电脑没有声音的原因3、可能是电脑...

0xc000000e(电脑蓝屏0xc000000e)

方法一、断开外部设备的连接0xc000000e错误可能是由于硬件故障或不兼容。要检验是不是这个原因,你可以先断开电脑最近连接的外部设备。另外,拔掉电脑或主机上的存储设备,比如U盘、读卡器,还有CD、D...

wifi不可上网怎么办(明明连接上wifi,却显示不可上网)

一般都是路由器不稳定造成的wifi连接是不能上网,可以先把家里的路由器断电源之后再重新设备启动,通常都可以正常使用了;也有可能是出现故障导致wifi连接上不能上网,可以打电话给宽带客服查询是否欠费,若...

微软官网正版win10系统价格(微软官网正版win10系统价格表)

微软官网下载的win10,只有用正版密钥激活后才是正版的。如果用工具激活就是盗版的。微软操作系统是美国微软开发的Windows系列视窗化操作系统。个人版目前最高版本为Windows11,因为微软的个...

什么主板最好(i714700kf配什么主板最好)

1.华硕主板:是全球知名的主板制造商,定位一线品牌,市场占有率最大。2.技嘉主板:技嘉科技是全球一线主板制造,产品包括电脑、通讯与消费性电子产品,技嘉主板的出货量仅次于华硕主板,同属一线品牌。3.微星...

五笔输入法哪个最好用

我是一个五笔爱好者,曾经用过“王码五笔字型输入法86版”、“极品五笔”、“搜狗五笔”、“QQ五笔”、“海峰五笔”。最后我选择了“QQ五笔”,并且现在一直在用。我感觉QQ五笔各方面做的都很好,用了以后,...

网易邮箱免费注册入口(网易邮箱163注册入口)

1、用浏览器打开163邮箱官网(mail.163.com),在主页登录框下面,点击【注册易网邮箱】”按钮。?2、跳转到邮箱信息填写界面,输入邮箱地址和密码。?3、填写完成过后,获取手机验证码,点击【立...

pp助手官方下载电脑版(pp助手pc版下载)

在苹果应用商店中搜索pp助手后下载安装即可如果出现pp助手已连接但无法识别手机的情况,可能是因为以下几个原因导致的:1.手机操作系统版本不兼容:有些手机操作系统可能不支持pp助手的某些功能或者版本...

台式电脑组装app(台式电脑组装配置推荐玩游戏专用)
  • 台式电脑组装app(台式电脑组装配置推荐玩游戏专用)
  • 台式电脑组装app(台式电脑组装配置推荐玩游戏专用)
  • 台式电脑组装app(台式电脑组装配置推荐玩游戏专用)
  • 台式电脑组装app(台式电脑组装配置推荐玩游戏专用)
win10桌面壁纸超清4k(window10壁纸高清)

你好,尝试以下操作:右键任务栏打开设置左侧选择颜色右侧找到显示“开始”菜单、任务栏和操作中心的颜色设置为开1.首先点击打开360壁纸;2.打开360壁纸后,点击进入动态壁纸页面;3.将鼠标放...

360路由器设置页面(360路由器路由模式怎么设置)

1.首先,我们需要将360wifi路由器与网络运营商所提供的猫用网线按照猫、路由  2.当我们把360wifi路由器与电脑连接完毕之后,打开电脑中的浏览器,在地址栏输入360wifi路由器所特有的设置...

u盘检测软件手机版(u盘检测软件手机版下载)

U盘容量检测工具也就是金山U盘卫士,主要用于检测U盘的真实容量,鉴定出U盘的真实大小、实际大小、真实比例和鉴定结论,防止商家欺骗,除了此功能之外,还具有全面查杀、容量鉴定、读写测速和数据恢复功能,有需...

取消回复欢迎 发表评论: