java ajax post 跨域请求数据_js跨域请求数据的3种常用的方法

由于js同源策略的影响,当在某一域名下请求其他域名,或者同一域名,不同端口下的url时,就会变成不被允许的跨域请求。

那这个时候通常怎么解决呢,对此菜鸟光头我稍作了整理:

1.JavaScript

在原生js(没有jQuery和ajax支持)的情况下,通常客户端代码是这样的(我假设是在localhost:8080的端口下的http://localhost:8080/webs/i.mediapower.mobi/wutao/index.html页面的body标签下面加入以下代码):

var xhr = new XMLHttpRequest();

xhr.open("get", "http://i2.mediapower.mobi/adpower/vm/Bora/js/test.js", true);

xhr.onreadystatechange = function() {

if (xhr.readyState == 4 && xhr.status == 200) {

console.log(xhr.responseText);

}

};

xhr.send(null);

保存,浏览器打开http://localhost:8080/webs/i.mediapower.mobi/wutao/index.html,并且打开console控制台:

f2e96cf39d5766fd3e215ba1a42dd33b.png

浏览器很无情的给你弹出一个同源限制的错误,意思就是你无法跨域请求url的数据。

那么,我先采取第一种策略,运用html中的script标签,插入js脚本:

(1)通过script标签引用,写死你需要的src的url地址,比如:

var callbackfunction = function(data) {

console.log('我是跨域请求来的数据-->' + data.name);

};

这里我定义一个callbackfunction的函数,然后用script标签的src属性跨域请求数据,那么,test.js的内容经过约定,需要写成这样:

callbackfunction({"name":"wwwwwwwwwwww"});保存,打开index.html并刷新:

20508b338ebbd11fc37ef90add83a8df.png

(2)你也可以动态的加入script标签,让html解析的时候,动态的加载script脚本,并请求远端数据:

var callbackfunction = function(data) {

console.log('我是跨域请求来的数据-->' + data.name);

};

var script = document.createElement('script'),

body = document.getElementsByTagName('body');

script.src = 'http://i2.mediapower.mobi/adpower/vm/Bora/js/test.js?callback=callbackfunction';

body[0].appendChild(script);

结果和上面一样。

20508b338ebbd11fc37ef90add83a8df.png

2.jQuery中的$.ajax()

设想,当你想要使用jQuery请求跨域数据的时候,比如(还是刚才的index.html):

$(function(){

$.get('http://i2.mediapower.mobi/adpower/vm/Bora/js/test.js',function(data){

console.log(data);

})

})

浏览器还是无情的报错,因为你这个url是不同的域名下的。

那么既然jQuery封装了ajax方法,我们为何不用,人家封装好了,你不用,岂不是找罪受么,代码如下:

$(function(){

$.ajax({

async: false,

type: "GET",

dataType: 'jsonp',

jsonp: 'callback',

jsonpCallback: 'callbackfunction',

url: "http://i2.mediapower.mobi/adpower/vm/Bora/js/test.js",

data: "",

timeout: 3000,

contentType: "application/json;utf-8",

success: function(msg) {

console.log(msg);

}

});

})

cea018d81390f9c9b68c40624b7c19a3.png

当你作了这么多挑逗工作之后,浏览器很爽快的给出了反应,表示它很爽,返回给了你一个对象,里面是远端不同域名下test.js中的数据。

3.postMessage+iframe

postMessage是HTML5中新增加的功能,比如我在本地域名下,http://192.168.1.152:8080/webs/i.mediapower.mobi/wutao/testa.html中的testa.html中:

testa

window.onload = function() {

document.getElementById('ifr').contentWindow.postMessage('我是要经过传递的数据', 'http://i2.mediapower.mobi/adpower/vm/Bora/testb.html');

};

此时,我远端的testb.html里面的内容应该是这样:

testb

window.addEventListener('message', function(event) {

// 通过origin属性判断消息来源地址

if (event.origin === 'http://192.168.1.152:8080') {

alert(event.data);

}

}, false);

123

保存代码,打开本地testa.html,访问远端的testb.html

7694bd048a6b5d9901ea5c4fd121b122.png

总结了一下,jQuery还是非常的好用的,基本上js能干的事情,jQuery都能非常快速并且高效的完成,当然,原生js也能解决很多事情,而HTML5的新功能也非常强大,这几种方法,我还是首推jQuery。

以上就是为大家分享的3种常用的js跨域请求数据的方法,希望对大家的学习有所帮助。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值