jquery跨域请求

解决浏览器非同源跨域问题

JSONP:JSONWITHPIDDING是一种非官方的协议。

允许在服务器端生成javaScripttag返回至客户端,jsonp是一种scripttag的注入将server返回的response添加到页面实现特定功能.

浏览器同源策略:浏览器限制脚本只能在相同协议、同域名、同端口的脚本进行交互。包括共享和传递参数、变量等。cookie的传递也遵循同源策略

如何解决跨域访问呢?那就要借助浏览器的一个特性:尽管浏览器不允许页面中的脚本程序跨域读取数据,但却允许HTML引用跨域的资源,如图片,CSS和脚本程序。对于脚本程序的引用比较特殊,它被浏览器解析以后,就和本地的脚本程序别无二致且可立即进行解释并执行。

通过<script>标记的使用,就可从服务端直接返回可执行的JavaScript函数调用或者JSON数据。

JSONP原理与实现

首先在客户端注册一个callback,然后把callback的名字传给服务器。此时,服务器先生成JSON数据。然后以JavaScript语法的方式,生成一个function,function名字就是传递上来的参数jsonp.

然后,将JSON数据直接以入参的方式,放置到function中,这样就生成了一段js语法的文档,返回给客户端。

最后,在客户端浏览器中解析script标签,并执行返回的JavaScript文档,此时数据作为参数,传入到了客户端预先定义好的回调函数里(动态执行回调函数)。

示例:

<script type="text/javascript">  
    function jsonpCallback(result){   
       alert(result[1].name);   
    }   
</script>
<script type="text/javascript"src="http://localhost:8080/Jsonp/jsonp.jsp?callback=jsonpCallback"></script>

jquery代码

<script type="text/javascript">   
	$.getJSON("http://localhost:8080/Jsonp/jsonp.jsp?callback=?", function(json){    
		alert(json[0].name);   
	});   
</script>
//[b]ajaxJson[/b]
var qsData = {'searchWord':$("#searchWord").attr("value"),'currentUserId':$("#currentUserId").attr("value"),'conditionBean.pageSize':$("#pageSize").attr("value")};
$.ajax({
   async:false,
   url: http://跨域的dns/document!searchJSONResult.action,
   type: "GET",
   dataType: 'jsonp',
   jsonp: 'jsoncallback',
   data: qsData,
   timeout: 5000,
   beforeSend: function(){
   //jsonp 方式此方法不被触发.原因可能是dataType如果指定为jsonp的话,就已经不是ajax事件了
   },
   success: function (json) {//客户端jquery预先定义好的callback函数,成功获取跨域服务器上的json数据后,会动态执行这个callback函数
}
});
//[b]java端[/b]
     //callback 客户端传递过来的回调函数的名称
     String callback = request.getParameter("callback"); 
     out.print(callback+"([ { name:'John',age:'19'},{ name:'joe',age:'20'}] );");
     out.print(callback);

相关推荐