详尽分享突破ajax不能跨域的限制

简介: 详尽分享突破ajax不能跨域的限制

众所周知,ajax不能发送跨域请求,这是浏览器的同源策略导致的,该策略阻止不同域的两个页面修改对方属性。浏览器安全机制的实现需要这种特性。

今天碰到了这个问题,我们需要在别的网站上放一个插件工具条,该工具条对应该网站需要显示不同的信息,这需要通过请求我们的网站来得到数据,跨域问题就出现了。

那么如何突破ajax不能跨域的限制呢?

有两种方法可以解决,但是使用这两种方法,和ajax的关系就不太大了。

1. 服务端代理

可以先用ajax请求同源的服务端,在服务端请求跨域的另一个网站(服务端没有跨域限制),然后将服务端获得的数据发送给前端即可。

该方法的缺点是:代理服务端只能在ajax请求所在的域,对于我碰到的情况显然是不能实现的,我不可能在别的网站服务端添加需要的代码。

2. jsonp

利用script标签,该标签的src属性是没有跨域限制的,通过利用script跨域获取数据,并传递一个回调函数,在script标签动态插入dom后,远程数据就被下载下来,并可执行已定义好的客户端回调函数,实现跨域访问。

该方法缺点:服务端必须支持jsonp,且jsonp不支持post请求,不能发送过长的数据。

利用jsonp,顺利解决了我碰到的问题。jquery等js库已实现了jsonp请求,可以方便使用。

下面给出一个利用jsonp实现从sina获取股票开盘价,当前价等信息,以及K线图的 jsonp抓取股票信息示例。

1

2   .kline-img{border-bottom:1px solid #666;margin:10px 0 20px;padding-bottom:10px;}//代码效果参考:http://www.ezhiqi.com/bx/art_63.html

3   .kline-img img{margin:10px;border:1px solid #333;}

4   .kline-img p{margin:0;line-height:18px;}

5   .kline-img p span{color:#ff7800;}

6

7

8

9

10 $(document).ready(function(){

11   var script=document.createElement('script'),colNames=【'股票名称','今日开盘价','昨日收盘价','当前价格','今日最高价','今日最低价','竞买价','竞卖价','成交的股票数','成交金额','“买一”申请股数','“买一”报价','“买二”','“买二”','“买三”','“买三”','“买四”','“买四”','“买五”','“买五”','“卖一”申报股数','“卖一”报价','“卖二”','“卖二”','“卖三”','“卖三”','“卖四”','“卖四”','“卖五”','“卖五”','日期','时间'】,klines=【'min','daily','weekly','monthly'】,klineUrl='',list=【'sh601006','sh601001'】;//此处的股票代码修改为你需要的即可

12   document.body.appendChild(script);

13   script.src=''+list.join(',');

14

15   function show(){

16     var data=window【'hqstr'+list【0】】;

17     if(!data){

18       setTimeout(show,1000);

19     }else{

20       data=formatData();

21       $('.container').html(data);

22     }

23   }

24   show();

25   function formatData(){

26     var d='';

27     for(var i=0;i

28       d+=''+colNames【i】+'';

29     }

30     for(var i=0;i

31       d+='';

32       var ds=window【'hqstr'+list【i】】.split(',');

33       for(var j=0;j

34         d+=''+ds【j】+'';

35       }//代码效果参考:http://www.ezhiqi.com/bx/art_6211.html

36       d+='';

37     }

38     d+='';

39     for(var i=0;i

40       d+='

'+list【i】+' K线图

';

41       for(var j=0;j

42         d+='';

43       }

44       d+='';

45     }

46     return d;

47   }

48 })

49

相关文章
|
11月前
|
JSON 前端开发 JavaScript
AJAX(GET POST请求、 jQuery axios 发送请求、跨域--cors、请求超时、网络异常、放弃请求、重复发送请求)(三)
AJAX(GET POST请求、 jQuery axios 发送请求、跨域--cors、请求超时、网络异常、放弃请求、重复发送请求)(三)
|
2月前
|
移动开发 前端开发 安全
Ajax跨域的所有方法(最详细带使用教程!!!)
Ajax跨域的所有方法(最详细带使用教程!!!)
|
2月前
|
JSON 前端开发 安全
浏览器跨域限制:为什么浏览器不能跨域发送Ajax请求?
浏览器跨域限制:为什么浏览器不能跨域发送Ajax请求?
55 0
|
8月前
Ajax-jsonp跨域
Ajax-jsonp跨域
|
10月前
|
缓存 JSON 前端开发
Ajax:跨域与JSONP
Ajax:跨域与JSONP
49 1
|
11月前
|
缓存 JSON 前端开发
AJAX(GET POST请求、 jQuery axios 发送请求、跨域--cors、请求超时、网络异常、放弃请求、重复发送请求)(二)
AJAX(GET POST请求、 jQuery axios 发送请求、跨域--cors、请求超时、网络异常、放弃请求、重复发送请求)(二)
|
11月前
|
XML 数据采集 Web App开发
AJAX(GET POST请求、 jQuery axios 发送请求、跨域--cors、请求超时、网络异常、放弃请求、重复发送请求)(一)
AJAX(GET POST请求、 jQuery axios 发送请求、跨域--cors、请求超时、网络异常、放弃请求、重复发送请求)
|
12月前
|
前端开发 API PHP
漏刻有时开放平台数据接口php允许ajax跨域的解决方案
漏刻有时开放平台数据接口php允许ajax跨域的解决方案
38 0
|
前端开发 JavaScript Java
spring boot jquery ajax ie8解决跨域
spring boot jquery ajax ie8解决跨域
143 0
|
前端开发 JavaScript 安全
【Ajax进阶】跨域和JSONP的学习
跨域和JSONP的学习
157 0
【Ajax进阶】跨域和JSONP的学习