jsonp其实很简单[ajax跨域请求]

前两天被问到ajax跨域如何解决,还真被问住了,光知道有个什么jsonp,迷迷糊糊的没有说上来。抱着有问题必须解决的态度,我看了许多资料,原来如此。。。

为何一直知道jsonp,但一直迷迷糊糊的不明白呢?——网上那些介绍资料都写的太复杂了!

我是能多简单就多简单,争取让你十分钟看完!

1. 同源策略

ajax之所以需要“跨域”,罪魁祸首就是浏览器的同源策略。即,一个页面的ajax只能获取这个页面相同源或者相同域的数据。

如何叫“同源”或者“同域”呢?——协议、域名、端口号都必须相同。例如:

http://google.com 和 https://google.com 不同,因为协议不同;

http://localhost:8080 和 http://localhost:1000 不同,因为端口不同;

http://localhost:8080 和 https://google.com 不同,协议、域名、端口号都不同,根本不是一家的。

根据同源策略,我自己做的一个网页 http://localhost:8080/test.html 就无法通过ajax直接获取 http://google.com 的数据。

例如,我用ajax去访问一个不同域的页面,错误结果是这样的:

大家想想,这样其实也有道理。如果没有同源策略,你我都可以随便通过ajax直接获取其他网站的信息,这还不乱套了。。。我自己做一个搜索界面,搜索时直接用ajax从百度获取数据,那不成了小偷了。。。

但是跨域访问是少不了的,mail.163.com 的网页可能需要从 news.163.com 域下获取新闻信息,那怎么办?——开始咱们的跨域之旅。(当然用iframe也可以实现)

2. 从“盗链”说起

互联网的许多网站之间图片相互盗链,A网站网页的img.src直接链接到B网站的图片地址,这是常有的事儿。说到“盗链”,大家第一想到的可能是如何去防止盗链,今儿咱不管那个。

你再想想“盗链”和“同源策略”这两个词之间有什么关系?——对,矛盾!既然都“同源策略”了,怎么还能“盗链”呢?

世间万物都有矛盾,有矛盾了照样可以和谐共处,并不一定非要你死我活。

重点:的src(获取图片),的href(获取css),

运行 a.com/test.html,结果是弹出【 100px 】,这个应该也没有什么疑问。

引导第三步:已经跨域成功!

第二步中,如果data——即100——是我要跨域在b.com下获取的一个数据,那么咱们这不就是已经实现跨域请求了吗!!!

把这个过程再清晰的捋一遍:

将 b.com/data.html 编写为:(注意,data.html中就写以下一行代码,多了不写)

myFn(100);

运行 a.com/test.html ,结果依然是【 100px 】

其中,“100”就是我们要跨域请求的数据。

引导第五步:动态数据

如果要请求的数据是动态的,那就要在动态页面中编写。

那么我们就让 a.com/test.html 去调用一个动态的aspx页面:

大家注意,我们在 src 地址中增加了“?callback=myFn”,意思是把显示数据的函数也动态传过去了,而第二步、第四步都是静态的写在被调用的文件中的。

至于callback参数后台如何接收,如何使用,请接着看:

在 b.com 下增加一个 b.com/data.aspx 页面,后台代码如下:

protected void Page_Load(object sender, EventArgs e) { if (this.IsPostBack == false) { string callback = ""; if (Request["callback"] != null) { callback = Request["callback"]; //服务器端要返回的数据 string data = "1024"; Response.Write(callback + "(" + data + ")"); } } }

代码很简单,获取callback参数,然后组成一个函数的形式返回。如果“b.com/data.aspx?callback=myFn”调用的话,那么返回的就是" myFn(1024) "。

返回的数据变成动态的了(“1024”),前端页面用于显示数据的函数也编程了动态的了(“callback=myFn”),但是归根结底,形式还是一样的。

引导第六步:调用封装

a.com/test.html 中,仅仅有一个静静的躺在那里,执行一次之后,就没有作用了。

而实际情况是,a.com/test.html 中,可能随着用户的操作发生若干次的调用。怎么办?——动态增加呗。

function addScriptTag(src) { var script = document.createElement("script"); script.setAttribute("type", "text/javascript"); script.src = src; document.body.appendChild(script);}//需要调用时:addScriptTag('b.com/data.aspx?callback=myFn');function myFn (data) { alert(data + 'px'); }

4. 总结

以上层层描述的就是JSONP,你不必去记住它的定义,看明白了上述文字,就全能理解。

重点在于:同源策略 + 的src不属于同源策略 + 通过的src指向的文件返回服务器端数据。

ok,就这些!


相关文章

  • jquery请求格式和返回类型 汇总
  • 常规请求基本格式 1 [WebMethod]2 public string SayHello(string name)3 {4 return "Hello " + name;5 } 1 $.ajax({ 2 url: & ...

  • 对WebService的一下理解
  • XML ,用于传输格式化的数据,是Web 服务的基础. namespace-命名空间. xmlns="http://itcast.cn" 使用默认命名空间. xmlns:itcast="http://itcas ...

  • 前端开发面试题1
  • 1, 判断字符串是否是这样组成的,第一个必须是字母,后面可以是字母.数字.下划线,总长度为5-20 var reg = /^[a-zA-Z][a-zA-Z_0-9]{4,19}$/; reg.test("a1a__a1a__a1a ...

  • 超市管理系统 毕业论文
  • 毕业设计(论文) 题 目 超市管理系统 姓 名 学 号 专业班级 指导教师 分 院 信息科学与工程学院 完成日期 2013年5月28日 摘 要 本文建立了一种基于粒子群(PSO )算法优化BP 神经网络的改进股票预测模型.该模型采用时间序列 ...

  • 教师工作量统计系统
  • 教师工作量统计系统的研究与实现 学 校: 班 级: 姓 名: 摘 要 随着计算机及网络技术的飞速发展,Internet 应用在全球范围内日益普及,当今社会正快速向信息化社会前进,信息系统的作用也越来越大.教师工作量统计系统是典型的信息管理系 ...

  • 30篇文章融合了全球1500名顶级设计师的精髓
  • 其实这30篇文章是2007年的顶级设计师的灵魂产物,是经验丰富的设计师或设计程序员的经典作品介绍.但这30篇文章让所有的精品资源在同一地点下汇聚,并不是一件容易事情.今天精华之家带给大家的就是这个来自与全球1500名顶级设计师精心创作的作品 ...

  • Java开发中的关键技术
  • 1. servlet 技术 Servlet (Server Applet),全称Java Servlet.是用Java 编写的服务器端程序.其主要功能在于交互式地浏览和修改数据,生成动态Web 内容.狭义的Servlet 是指Java 语言 ...

  • 社交网络数据的分析及可视化技术
  • ValueEngineering ・149・ 社交网络数据的分析及可视化技术 SocialNetworkDataAnalysisandVisualizationTechnology 张开Zhang Kai (北京天融信网络安全技术有限公司, ...

  • 计算机 考研 面试题目大全
  • 8086/8088的内部中断主要有5种. (1)除法错中断 (2)单步中断 (3)断点中断 (4)溢出中断 (5)用户自定义的软件中断 在8086/8088内存的开始1K 字节建立了一个,每个由4个字节组成,低两位是IP 值,高两位是CS ...

© 2024 范文参考网 | 联系我们 webmaster# 12000.net.cn