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

常见跨域解决方案(一)

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


敬请期待~

相关推荐

2025最火网名(2025最火网名最新版)

1、绝世好女人2、气≦贯长虹3、滿眼浮華4、好久没换,改什么好5、成功可望6、小西福7、突然,好懷念8、翡ル翠鸿图9、陈运锋10、桃花峪运维朱恒彬11、金safety12、指间轻纱°13、花≦好月圆1...

163免费邮箱登录入口(126免费邮箱登录入口)

是https://mail.163.com/。原因是163邮箱是中国最早的电子邮件服务提供商之一,拥有稳定的运营和使用群体。用户可以通过网页直接登录,进行收发邮件,具有便捷、快速的特点。另外,163...

中国联通腾讯(中国联通腾讯大王卡)
中国联通腾讯(中国联通腾讯大王卡)

当时,联通免除抖音的流量费用,是因为联通和字节跳动公司有合作。现在合作已经结束了,所以就不免抖音流量了。其实可以理解为字节跳动花钱为大伙买流量,大伙免费用的意思。但是现在使用抖音的人这么多,人口基数这么大,字节跳动再买这么大的流量也买不起。...

2026-02-01 19:43 off999

酷狗音乐下载歌曲(酷狗音乐下载歌曲在哪能找到)
酷狗音乐下载歌曲(酷狗音乐下载歌曲在哪能找到)

本地音乐就是已下载的音乐。1、打开音乐,点击我的。2、点击本地。3、然后就看到已下载和推荐下载的音乐了。4、点击向下的箭头就可以下载了。意思就是在手机里面下载的音乐,保存到手机上面的就是本地音乐,在手机自带的音乐里面就能下载首先我们进入到...

2026-02-01 19:15 off999

免费法律咨询24小时在线(青岛免费法律咨询24小时在线)

没有这样的律师二十四小时不休息。首先要说的是,提问者二十四小时不休息等着律师二十四小时免费为你解答法律咨询呀?提这样的问题过过大脑,律师是活生生的人,不是电脑和机器人,二十四小时不休息的,这样的人想要...

无需root权限的游戏修改器

游戏修改器都需要root。原因如下:root意思是获得超级用户权限,root后才能打开系统文件,游戏文件都在系统文件里,不root是打不开系统文件的,就更别提修改了。你好游戏修改器都是修改系统的内...

网络推广平台哪家公司最好(网上怎么赚钱一天500)

1,依附于搜索引擎,针对各个搜索引擎做的,叫sem,包括了竞价和优化seo,这是目前最广泛应用的平台。2,微博,目前微博营销已经很火热,用户量巨大,也能带动产品的销售,尤其做电子商务的,一定重视微博。...

哔哩哔哩app(哔哩哔哩app官网)

哔哩哔哩是一个视频网站。哔哩哔哩现为国内领先的年轻人文化社区,该视频网站于2009年6月26日创建,被粉丝们亲切的称为“B站”。B站的特色是悬浮于视频上方的实时评论功能,爱好者称其为“弹幕”,这种独特...

qq号申请官网(qq号申请网站)

具体操作步骤如下:一、首先需要在电脑上安装QQ客户端,双击打开,进入登陆界面,然后点击右侧的注册帐号。二、点击后系统会打开浏览器,直接进入申请界面,按照要求填写昵称,登陆密码以及注册手机号码。三、手机...

安卓app安装下载官网(安卓app安装下载官网)
安卓app安装下载官网(安卓app安装下载官网)

1、打开苹果手机,找到APPstore。2、点击进入软件商场页面。3、这里搜索你想要下载的软件。点击下载,然后进行安转。1.可恢复:一般安卓机都会自带不允许按装软件的选项,要自己选择才可以安装软件,设置→安全→未知来源,只要不勾选就不能安...

2026-02-01 17:51 off999

虚拟号码打电话(虚拟号码拨打电话软件)
  • 虚拟号码打电话(虚拟号码拨打电话软件)
  • 虚拟号码打电话(虚拟号码拨打电话软件)
  • 虚拟号码打电话(虚拟号码拨打电话软件)
  • 虚拟号码打电话(虚拟号码拨打电话软件)
qq下载 免费下载(qq下载安装免费下载手机版本)

QQ号码注册成功后忘记/遗忘QQ号码怎么办?成功申请QQ号码后,建议您手动将QQ号码复制保存在本地,如果没有记录且关闭了页面,则无法在网页上找回QQ号码,如果您忘记QQ号码,可以尝试通过以下方法找回:...

查杀病毒最好的软件(病毒查杀软件推荐)

好用的电脑杀毒软件,目前比较知名的有360杀软,腾讯电脑管家,金山毒霸,瑞星等杀毒软件,至于哪一个更好用,就看你自己的习惯了,我个人觉得360比较让人放心一些,这些年也一直用着360,比较安全有保证,...

英语在线朗读(英语在线朗读发声器)

倍速课堂app。这个软件是专为中小学生用户打造的一款手机在线英语学习软件。整合小学到高中阶段的所有学科知识点,通过课本点读、配音听力、智能测评等手段,完美呈现语言学习中的听、说、读、写各种场景,构建立...

免费网站安全软件大全苹果版

目前,cad软件的官方下载渠道是Autodesk官网,这是最为靠谱的下载方式。在Autodesk官网上,用户可以从官方渠道下载最新版本的cad软件,也可以根据自己的需要选择合适的版本进行下载。此外,用...

取消回复欢迎 发表评论: