js/ajax跨越访问-jsonp的原理和实例(javascript和jquery实现代码)

最近做了一个项目,需要用子域名调用主域名下的一个现有的功能,于是想到了用jsonp来解决,在我们平常的项目中不乏有这种需求的朋友,于是记录下来以便以后查阅同时也希望能帮到大家,需要了解的朋友可以参考下

很庆幸,我又见到了末日后新升的太阳,所以我还能在这里写文章,言归正传哈,最近做了一个项目,需要用子域名调用主域名下的一个现有的功能,于是想到了用jsonp来解决,在我们平常的项目中不乏有这种需求的朋友,于是记录下来以便以后查阅同时也希望能帮到大家。

什么是JSONP协议?

JSONP即JSON with
Padding。由于同源策略的限制,XmlHttpRequest只允许请求当前源(域名、协议、端口)的资源。如果要进行跨域请求,我们可以通过使用html的script标记来进行跨域请求,并在响应中返回要执行的script代码,其中可以直接使用JSON传递javascript对象。这种跨域的通讯方式称为JSONP。

很明显,JSONP是一种脚本注入(Script Injection)行为,需要特别注意其安全性。

Jquery中的jsonp实例
我们需要两个页面,分别承担协议的客户端和服务器端角色。

客户端代码

复制代码
代码如下:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML
1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html
xmlns="http://www.w3.org/1999/xhtml" >
<head>

<title>jsonp测试例子</title>
<script type="text/javascript"
src="http://www.xxxxxxxxxxxx.cn/js/jquery.min.js"></script>

<script type="text/javascript">
jQuery(document).ready(function(){

$.ajax({
type: "get",
async: false,
url:
"http://www.xxxxxxxxxxxx.cn/demos/jsonp.php",
dataType: "jsonp",
jsonp:
"callback",//传递给请求处理程序或页面的,用以获得jsonp回调函数名的参数名(一般默认为:callback)

jsonpCallback:"feedBackState",//自定义的jsonp回调函数名称,默认为jQuery自动生成的随机函数名

success: function(data){
var $ul = $("<ul></ul>");

$.each(data,function(i,v){
$("<li/>").text(v["id"] + " " +
v["name"]).appendTo($ul)
});
$("#remote").append($ul);
},
error:
function(){
alert(‘fail‘);
}
});
});
</script>

</head>
<body>
远程数据如下:<br/>
<div
id="remote"></div>
</body>
</html>

服务端代码(本例采用PHP)

复制代码
代码如下:

<?php
$jsonp =
$_REQUEST["callback"];
$str =
‘[{"id":"1","name":"测试1"},{"id":"2","name":"测试2"}]‘;
$str = $jsonp . "("
.$str.")";
echo $str;
?>

 
Jsonp的原理和简单实例

jquery是对其进行了封装,你可能看不到真正的实现方法,我们用下面的一个例子进行说明:
客户端代码:

复制代码
代码如下:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML
1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html
xmlns="http://www.w3.org/1999/xhtml" >
<meta http-equiv="Content-Type"
content="text/html; charset=utf-8" />
<head>

<title>jsonp测试例子</title>
<script type="text/javascript"
src="http://www.xxxxxxxxxxxx.cn/js/jquery.min.js"></script>

<script type="text/javascript">
function CallJSONPServer(url){ //
调用JSONP服务器,url为请求服务器地址
var oldScript =document.getElementById(url); //
如果页面中注册了调用的服务器,则重新调用
if(oldScript){
oldScript.setAttribute("src",url);

return;
}
var script =document.createElement("script"); //
如果未注册该服务器,则注册并请求之
script.setAttribute("type", "text/javascript");

script.setAttribute("src",url);
script.setAttribute("id", url);

document.body.appendChild(script);
}
function
OnJSONPServerResponse(data){
var $ul = $("<ul></ul>");

$.each(data,function(i,v){
$("<li/>").text(v["id"] + " " +
v["name"]).appendTo($ul)
});
$("#remote").append($ul);
}

</script>
</head>
<body>
<input
type="button" value="点击获取远程数据"
onclick="CallJSONPServer(‘http://www.xxxxxxxxxxxx.cn/demos/jsonp_original.php‘)"
/>
<div id="remote"></div>
</body>

</html>

服务端代码

复制代码
代码如下:

<?php
$str =
‘[{"id":"1","name":"测试1"},{"id":"2","name":"测试2"}]‘;
$str =
"OnJSONPServerResponse(" .$str.")";
echo $str;
?>

 
别的不多说,相信看代码大家应该明白它是怎么实现的了。

需要注意
1.由于 jquery 在ajax
处理中使用的是utf-8编码传递参数的,所以jsonp处理端用utf-8的编码最好,这样省得编码转换了,如果不是utf-8记得转换,否则中文会乱码。

2.请求的服务端url最好不要写成http://www.xxxxxxxxxxxx.cn/?act=add这样的,应写全其为:http://www.xxxxxxxxxxxx.cn/index.php?act=add这样的,在应用的过程中出现了不兼容的情况。

到此就ok了,如有朋友碰到什么问题可发上来大家共同交流。
欢迎大家转载,转载请注明原创 包括链接一定要加上,否则...此处略去n个字

签名:共同交流,共同学习,帮助需要帮助的人,共同走向成功之路。

您可能感兴趣的文章:

js/ajax跨越访问-jsonp的原理和实例(javascript和jquery实现代码),布布扣,bubuko.com

时间: 2024-10-07 19:23:31

js/ajax跨越访问-jsonp的原理和实例(javascript和jquery实现代码)的相关文章

JSONP的原理与实现(基于jQuery)

为什么会有JSONP?因为我们使用AJAX,使用AJAX可能就会遇到跨域的需求,如何解决呢,对,就是JSONP. 这里注意下JSON和JSONP不是一类,虽然他们只是一个字母只差,但是实际差别很大.这里简单介绍下: JSON:JSON(JavaScript Object Notation)是一种基于文本的数据交换方式,或者叫做数据描述格式. JSON的优点: 1.基于纯文本,跨平台传递极其简单: 2.Javascript原生支持,后台语言几乎全部支持: 3.轻量级数据格式,占用字符数量极少,特别

.NET中Ajax跨越访问

说明:我们知道Ajax是不能进行跨域请求的,我们是可以设置我们的项目让Ajax支持跨域访问. 跨域: aa.xxx.com 中用ajax请求  bb.ccc.com中的数据成为跨域. 找了一些文章看了的, 无非都是说 jsonp是get的解决办法,cross是post请求的解决办法.这边自己也测试了下.这边记录一下. ①我们先准备好我们的接口 然后需要我们发布一下,这个就是我们的接口地址了() :http://apitest.sealee.xin/api/ajaxcross (get/post(

AJAX跨越访问解决方案

1.JSONP JSONP参考教材:http://kb.cnblogs.com/page/139725/ JSONP是利用HTML的script标签一下特性: 1)引用外部资源不受跨域问题影响 2)script标签加载完js资源后立马自动执行加载的js 3)新加载的js作用域为全局 script标签的src属性指向服务端动态生成js文件,该js文件的基本格式如下: callback(jsonData); 其中callback函数在客户端定义,名称不定,由script标签通过url传参传递到服务器

js ajax异步访问,jquery的each方法

$.ajax({ cache: true, type: "POST", url:"******.do", data:{typename:typename}, async: false, error: function(request) { alert("连接异常,请联系管理员"); }, success: function(data) { $.each(data.BData,function(i,item){ str_html += '<o

js ajax post 提交的时候后台接收不到参数,但是代码没有错,怎么回事

这个错误有两点,你自己写的php页面里面的参数接收出错了 还有就是你没有写一句重要的代码告诉浏览器 你使用post提交方式去提交 xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded"); 出现这个错误的时候  php页面信息就会说 你的什么参数是未定义的(Undefined) 如果以上两点都没错还是接收不到参数  可以互相交流 原文地址:https://www.cnblogs.

js实现跨域(jsonp, iframe+window.name, iframe+window.domain, iframe+window.postMessage)

一.浏览器同源策略 首先我们需要了解一下浏览器的同源策略,关于同源策略可以仔细看看知乎上的一个解释.传送门 总之:同协议,domain(或ip),同端口视为同一个域,一个域内的脚本仅仅具有本域内的权限,可以理解为本域脚本只能读写本域内的资源,而无法访问其它域的资源.这种安全限制称为同源策略. ( 现代浏览器在安全性和可用性之间选择了一个平衡点.在遵循同源策略的基础上,选择性地为同源策略"开放了后门". 例如img script style等标签,都允许垮域引用资源.) 下表给出了相对 

Ajax请求利用jsonp实现跨域

跨域: js有一个同源限制,简单说来源不一样的话就无法相互间交互.那么怎么算来源不一样呢, 举个例子:浏览器访问-->服务器A--->得到页面A---页面A中的js脚本只能访问服务器A的资源(相同域名和端口,此外域名与对应的ip也算不同源,要么都域名,要么都ip). 以上就是js的跨域问题,但是这里需要注意一点的是服务器A是没有跨域的问题的,这个只有js存在这个问题,也就是说: 页面A中js-->服务器A--->跨域资源,这个路径是可以.只有 页面A中的js--->跨域资源,

jsonp协议原理深度解析

前言 今天在开发联调的过程中,需要跨域的获取数据,因为使用的jquery,当然使用dataType:'jsonp'就能够很easy的解决了.但是因为当时后端没有支持jsonp来访问,后来他在实现这个功能的时候问了我一句,jsonp形式返回的格式是怎么样子的?我一直以来只知道怎么使用,迷迷糊糊的却没有答上来... 虽然后来解决了,但是对于喜欢解决问题的我,心里却一直耿耿于怀,必须得把这个研究透彻了,于是我开始翻阅资料,看到后面真有种豁然开朗的感觉,于是打算做个笔记与大家分享. JSON和JSONP

关于javascript跨域及JSONP的原理与应用

同源策略,它是由Netscape提出的一个著名的安全策略,现在所有的可支持javascript的浏览器都会使用这个策略. 为什么需要同源策略,这里举个例子: 假设现在没有同源策略,会发生什么事情呢?大家知道,JavaScript可以做很多东西,比如:读取/修改网页中某个值.恩,你现在打开了浏览器,在一 个tab窗口中打开了银行网站,在另外一个tab窗口中打开了一个恶意网站,而那个恶意网站挂了一个的专门修改银行信息的JavaScript,当你访问 这个恶意网站并且执行它JavaScript时,你的