了解:ajax、json、jsonp、“跨域”的关系

要弄清楚以上ajax、json、jsonp概念的关系,我觉得弄清楚ajax是“干什么的”,“怎么实现的”,“有什么问题”,“如果解决存在的问题”等这几个问题,就自然明白了。

1)ajax是干什么的?

Ajax是最大的亮点是在不刷新页面的情况下,迅速的响应用户的一些请求行为,从而提升用户的体验。

2)怎么实现的?

Ajax是基于xmlHttpRequest(XHR)对象与server端进行通信,将一些数据传送给服务器端,服务器端再以一定的格式将结果数据返回给客户端处理。其中目前最流行的数据格式就是json格式。

在ajax请求的场景中,我们可以通过firefox的firebugger查看XHR,就可以找到该请求的一些信息了。

3)有什么问题?

由于xmlHttpRequest(XHR)对象是遵守浏览器同源策略的,因而只能与当前页面同源的server端进行交互,也就是会遇到“跨域问题”。

这里可以得出一个结论:目前只要是采用基于xmlHttpRequest(XHR)对象的ajax请求就会碰到“跨域问题”。

4)如何解决?

Ajax由于是基于xmlHttpRequest(XHR)对象的,有跨域问题,那对于跨域的请求ajax就行不通了,只能另找它法了。

JSONP就是其中一种方案。JSONP实际上是利用浏览器同源策略对<script>标签的引入不做限制这一缺口,实现跨域请求的。也就是说浏览器可以跨域引入其他域的script脚本,这样就可以通过js生成一个script标签,并让它的src指向不同域的链接对不同域的server端发起请求,server端进行处理后,返回一段script脚本,在客户端执行。

举一个自己试验过的例子,在任意一个页面中,写入类似如下的script标签和js函数:

这样后端返回类似test(data)的数据,在页面上执行,就完成了跨域请求。

结论:

从上面四点,就可以知道json是ajax请求的一种数据交换格式,jsonp与ajax是完全不同的两种请求方式,jsonp是用来解决ajax不能跨域的一种解决方案。

启发:

     1) 要实现跨域,基于XHR的ajax目前基本是行不通的。

2) 要实现跨域,只要找到既不刷新页面、又不被浏览器阻止与js交互的请求方式,基本上就找到了跨域请求的解决办法。

例如:script请求、image请求、flash请求等都是可以利用来做异步请求的。

a.      Jsonp就是script请求的典型代表之一,而且是我们平时用的最多的一种方式;

b.      image请求其实我们也已经用过很多了,比如我们经常用的打点功能,查看其源码,可以知道打点功能完全可以基于这种方式完成的;

c.      flash请求用的比较少,跨域的例子在我们的应用中暂时还没找到,不过通过flash自身本身就有跨域实现机制,而且与js交互也比较灵活,可以分析出实现跨域应该是没有问题。

亲身测试:TSP项目

这两天在项目中写的一个ajax jsonp的使用,出现了问题:可以成功获得请求结果,但没有执行success方法,直接执行了error方法提示错误——ajax jsonp之前并没有用过,对其的理解为跟普通的ajax请求差不多,没有深入了解;出现了这种错误,几经调试(检查后台的代码和js部分的属性设置)还是不行,让我感觉很是意外和不解。于是,决定仔细研究下ajax jsonp的使用,并将最后测试成功。

前台代码:

 $("#aa-btn").click(function () {
$.ajax({
type: "get",
async: false,
url: "http://localhost:2475/news/getNews.ashx?action=get&type=0",
dataType: "jsonp",
jsonp: "callbackparam", //传递给请求处理程序或页面的,用以获得jsonp回调函数名的参数名(默认为:callback)
jsonpCallback: "success_jsonpCallback", //自定义的jsonp回调函数名称,默认为jQuery自动生成的随机函数名
success: function (json) {
debugger;
alert(json);
},
error: function (e, a, d) {
debugger;
alert('fail');
}
});
});

后台服务代码:

 public void ProcessRequest(HttpContext context)
{
context.Response.ContentType = "application/json";
context.Response.ContentEncoding = System.Text.Encoding.UTF8;
string ReturnCode = string.Empty;
string callback = string.Empty;
string ErrorMsg = "参数错误";
ToJsonP tojsonp = new ToJsonP();
NewsBLL bll = new NewsBLL();
if (!string.IsNullOrEmpty(context.Request["callbackparam"]))
{
callback = context.Request["callbackparam"];//跨域-必有项。这个是跨域请求的回调,同前台Ajax的配置项jsonp同名(默认也是callback)。
}
string type = context.Request["type"];
ReturnCode = tojsonp.DataConvert(bll.GetNewsList(type));
//context.Response.Write(ReturnCode);
context.Response.Write(callback + "(" + ReturnCode + ")");
context.ApplicationInstance.CompleteRequest(); }

结果:正常进入success:functions(){}

jQuery的ajax jsonp跨域请求的更多相关文章

  1. jQuery的Ajax的跨域请求

    今天碰到一个Ajax跨域请求的问题,我把源码down下来,然后在服务器端写了一个http请求的代理(因为服务器端是不存在跨域问题的),说白了就是用BufferedReader写了个IO流,然后读取到目 ...

  2. Ajax jsonp 跨域请求实例

    跨域请求 JSONP的缺点则是:它只支持GET请求而不支持POST等其它类型的HTTP请求:它只支持跨域HTTP请求这种情况,不能解决不同域的两个页面之间如何进行JavaScript调用的问题. $. ...

  3. ajax jsonp 跨域请求

    $.ajax({ type:"get", url: "http://localhost/test/a.php", dataType: "jsonp&q ...

  4. JSONP 跨域请求 - 获取JSON数据

    如何用原生方式使用JSONP? 下边这一DEMO实际上是JSONP的简单表现形式,在客户端声明回调函数之后,客户端通过script标签向服务器跨域请求数据,然后服务端返回相应的数据并动态执行回调函数. ...

  5. jQuery ajax的jsonp跨域请求

    一直在听“跨域跨域”,但是什么是跨域呢?今天做了一些了解.(利用jQuery的jsonp) jQuery使用JSONP跨域 JSONP跨域是利用script脚本允许引用不同域下的js实现的,将回调方法 ...

  6. 利用jquery的ajax实现跨域,内部其实是jsonp协议了,不是XHRhttp协议

    一.同源策略 要理解跨域,先要了解一下“同源策略”.所谓同源是指,域名,协议,端口相同.所谓“同源策略“,简单的说就是基于安全考虑,当前域不能访问其他域的东西. 一些常见的是否同源示例可参照下表: 在 ...

  7. .net学习之母版页执行顺序、jsonp跨域请求原理、IsPostBack原理、服务器端控件按钮Button点击时的过程、缓存、IHttpModule 过滤器

    1.WebForm使用母版页后执行的顺序是先执行子页面中的Page_Load,再执行母版页中的Page_Load,请求是先生成母版页的控件树,然后将子页面生成的控件树填充到母版页中,最后输出 2.We ...

  8. jQuery之ajax的跨域获取数据

    如果获取的数据文件存放在远程服务器上(域名不同,也就是跨域获取数据),则需要使用jsonp类型.使用这种类型的话,会创建一个查询字符串参数 callback=? ,这个参数会加在请求的URL后面.服务 ...

  9. JSONP跨域请求数据报错 “Unexpected token :”的解决办法

    原文  http://www.cnphp6.com/archives/65409 Jquery使用ajax方法实现jsonp跨域请求数据的时候报错 “Uncaught SyntaxError: Une ...

随机推荐

  1. NS2仿真:两个移动节点网络连接及协议性能分析

    NS2仿真实验报告2 实验名称:两个移动节点网络连接及协议性能分析 实验日期:2015年3月9日~2015年3月14日 实验报告日期:2015年3月15日 一.实验环境(网络平台,操作系统,网络拓扑图 ...

  2. jquery之营销系统(会员促销)

    var appPath = getAppPath(); var cnt = 0; var loadCnt = 0; $(function() { $("#opreateHtml") ...

  3. rhel Linux 网络配置

    --网络配置 vi /etc/sysconfig/network-scripts/ifcfg-eth0 1)DHCPDEVICE=eth0BOOTPROTO=dhcpONBOOT=yes2)静态IP  ...

  4. asp.net(C#)利用QRCode生成二维码---.NET菜鸟的成长之路

    <%@ Page Language="C#" AutoEventWireup="true" CodeFile="QRCode.aspx.cs&q ...

  5. 服务器上开启远程sqlserver小细节

    之前按网络上过程配置完成后,连接都很正常.今天看的时候,突然就连接不上了.弄了半天,终于知道问题在哪里了.

  6. VS 的winform中生成release模式

    我试过,直接在项目的"Properties"中,修改"Build"标签的"Configuration"还不行.因为之前将不常用的工具栏隐藏了 ...

  7. Xcode使用xib拖线时出现: could not insert new outlet connection

    解决方法: 1.在新建类的时候没有选择将这个类加入到对应的"Target"中. 2.重新将文件加入项目 操作步骤就是选中出问题的.m和.h文件,点删除键,然后选"Remo ...

  8. ECstore报表不显示解决

    最近研究ECSTORE发现后台报表显示空白,Google了一下发现N多统一的做法,直接往表里插几条数据.呵呵,更深入一点 1.要显示报表功能首先要确保已经配置好contab的定时任务,定时任务能够执行 ...

  9. python list内容拷贝方法

    先看如下代码: x = ['a','b','z'] y = x print y y[0] = 'w' print x,y 结果输出: >>> ['a', 'b', 'z'] #y l ...

  10. (转载)lib 和 dll 的区别、生成以及使用详解

    简单地讲: 第一:.DLL是动态链接库,而.LIB是静态链接库dll是个编译好的程序,调用时可以直接调用其中的函数,不参加工程的编译. 而lib应该说是一个程序集, 只是把一些相应的函数总结在一起, ...