GVKun编程网logo

AJAX跨域 jQuery JSONP 实践(ajax jsonp跨域请求)

21

如果您对AJAX跨域jQueryJSONP实践和ajaxjsonp跨域请求感兴趣,那么这篇文章一定是您不可错过的。我们将详细讲解AJAX跨域jQueryJSONP实践的各种细节,并对ajaxjsonp

如果您对AJAX跨域 jQuery JSONP 实践ajax jsonp跨域请求感兴趣,那么这篇文章一定是您不可错过的。我们将详细讲解AJAX跨域 jQuery JSONP 实践的各种细节,并对ajax jsonp跨域请求进行深入的分析,此外还有关于Ajax----原生,jquery, 跨域:jsonp, cors、ajax跨域 PHP中运用jQuery的Ajax跨域调用实现代码、AJAX跨域与JSONP的一点实践经验、Ajax跨域原理JQuery之Jsonp使用剖析的实用技巧。

本文目录一览:

AJAX跨域 jQuery JSONP 实践(ajax jsonp跨域请求)

AJAX跨域 jQuery JSONP 实践(ajax jsonp跨域请求)

一直对jQuery 的jsonp 调用比较疑惑,今天研究了一下jsonp 做了一个简单的调用例子,我用asp做服务端s

客户端(url:http://192.168.1.2:81/jsonp_test.asp)

客户端页面首先在body 中放置一个div: <div id="res"></div> 将远程调用的数据写入该div中

<script type="text/javascript" src="/js/jquery-1.3.2.min.js"></script>
<script type="text/javascript">
    $(document).ready(function(){
        $.ajax({
             url:'http://192.168.9.5/jsonp_proc.asp',dataType:"jsonp",jsonp:"jsonpcallback",success:function(data){
                 var $ul = $("<ul></ul>");
                 $.each(data,function(i,v){
                     $("<li/>").text(v["id"] + " " + v["name"]).appendTo($ul)
                 });
                 $("#res").append($ul);
             }
        });
    });
</script>

服务端( url:http://192.168.1.5/jsonp_proc.asp
代码很简单,就是输出一个字符串
比如正常输出json应该是:[{"id":"1","name":"测试1"},{"id":"2","name":"测试2"}]
jsonp 则输出: jsonpcallback([{"id":"1","name":"测试2"}]) 其中“jsonpcallback”是客户端传过来的

jsonp = request("jsonpcallback")
  str = "[{""id"":""1"",""name"":""测试1""},{""id"":""2"",""name"":""测试2""}]"
  str = jsonp & "(" & str&")"
  response.Write(str)

由于 jquery 在ajax 处理中使用的是utf-8编码传递参数的,所以jsonp处理端用utf-8的编码最好,这样省得编码转换了

最终效果截图:

Ajax----原生,jquery, 跨域:jsonp, cors

Ajax----原生,jquery, 跨域:jsonp, cors

ajax简介

AJAX即“AsynchronousJavascriptAndXML”(异步JavaScript和XML),是指一种创建交互式网页应用的网页开发技术。Ajax不是一种新的编程语言,而是使用现有标准的新方法。AJAX可以在不重新加载整个页面的情况下,与服务器交换数据。这种异步交互的方式,使用户单击后,不必刷新页面也能获取新数据。使用Ajax,用户可以创建接近本地桌面应用的直接、高可用、更丰富、更动态的Web用户界面。

Ajax包括:

  • XHTML和CSS
  • 使用文档对象模型(Document Object Model)作动态显示和交互
  • 使用XML和XSLT做数据交互和操作
  • 使用XMLHttpRequest进行异步数据接收

利用AJAX可以做:

  • 注册时,输入用户名自动检测用户是否已经存在。
  • 登陆时,提示用户名密码错误
  • 删除数据行时,将行ID发送到后台,后台在数据库中删除,数据库删除成功后,在页面DOM中将数据行也删除。(博客园)

ajax伪造

iframe就是我们常用的iframe标签:<iframe>。iframe标签是框架的一种形式,也比较常用到,iframe一般用来包含别的页面,例如我们可以在我们自己的网站页面加载别人网站或者本站其他页面的内容。iframe标签的最大作用就是让页面变得美观。iframe标签的用法有很多,主要区别在于对iframe标签定义的形式不同,例如定义iframe的长宽高。

因此,iframe标签具有局部加载内容的特性,所以可以使用其来伪造Ajax请求。

<!DOCTYPE html>
<html>
    head lang="en">
        Meta charset="UTF-8"title>伪造AJAX</</headbodydiv>
            p>请输入要加载的地址:span id="currentTime"></span>
                input ="url" type="text" />
                type="button" value="提交" onclick="LoadPage();"h3>加载页面位置:iframe ="iframePosition" style="width: 100%;height: 500px;"iframescript ="text/javascript">
            window.onload= function(){
                var myDate new Date();
                document.getElementById('currentTime).innerText = myDate.getTime();
 
            };
             LoadPage(){
                 targetUrl   document.getElementById(url).value;
                document.getElementById("iframePosition).src  targetUrl;
            }
        script>

原理是这样的,设置一个提交按钮,再设置一个输入框,当我们输入一个网址的时候,在当前的页面加载输入网址的页面信息,呈现在iframe框里,这样就能做到不刷新URL来提交不同的信息。

原生ajax

Ajax的核心是XMLHttpRequest对象(XHR)。XHR为向服务器发送请求和解析服务器响应提供了接口。能够以异步方式从服务器获取新数据。

一、XMLHttpRequest对象

XHR的主要方法有:

1. void open(String method,String url,Boolen async)   
   用于创建请求    
   参数:
       method: 请求方式(字符串类型),如:POST、GET、DELETE...
       url:    要请求的地址(字符串类型)
       async:  是否异步(布尔类型)
2. void send(String body) 用于发送请求 参数: body: 要发送的数据(字符串类型)
3. void setRequestHeader(String header,String value) 用于设置请求头 参数: header: 请求头的key(字符串类型) vlaue: 请求头的value(字符串类型) 4. String getAllResponseHeaders() 获取所有响应头 返回值: 响应头数据(字符串类型) 5. String getResponseHeader(String header) 获取响应头中指定header的值 参数: header: 响应头的key(字符串类型) 返回值: 响应头中指定的header对应的值 6. void abort() 终止请求

XHR的主要属性有:

1. Number readyState
   状态值(整数),可以确定请求/响应过程的当前活动阶段
  • 0:未初始化。未调用open()方法
  • 1:启动。已经调用open()方法,未调用send()方法
  • 2:发送。已经调用send()方法,未接收到响应
  • 3:接收。已经接收到部分数据
  • 4:完成。已经接收到全部数据,可以在客户端使用

2. Function onreadystatechange
当readyState的值改变时自动触发执行其对应的函数(回调函数)

3. String responseText                        作为响应主体被返回的文本(字符串类型)

4. XmlDocument responseXML 服务器返回的数据(Xml对象)

5. Number states 状态码(整数),如:200、404...

6. String statesText 状态文本(字符串),如:OK、NotFound...

二、get请求

GET用于向服务器查询某些信息:

>

    h1>XMLHttpRequest - Ajax请求="XmlGetRequest();"="Get发送请求" />

    src="/statics/jquery-1.12.4.js">

         GetXHR(){
             xhr null;
            if(XMLHttpRequest){
                xhr  XMLHttpRequest();
            }else{
                xhr  ActiveXObject(Microsoft.XMLHTTP);
            }
            return xhr;
        }
         XmlGetRequest(){
             GetXHR();
            // 定义回调函数
            xhr.onreadystatechange (xhr.readyState == 4){
                     已经接收到全部响应数据,执行以下操作
                     data  xhr.responseText;
                    console.log(data);
                }
            };
             指定连接方式和地址----文件方式
            xhr.open(get,/test/true);
             发送请求
            xhr.send();
        }
    >

三、post请求

POST请求用于向服务器发送应该被保存的数据。POST请求的主体可以包含非常多的数据,而且格式不限。

>POST="XmlPostRequest();"="Post发送请求"  XmlPostRequest(){
            POST 设置请求头
            xhr.setRequestHeader(Content-Typeapplication/x-www-form-urlencoded; charset-UTF-8            xhr.send(n1=1;n2=2;);
        }
    >

jquery ajax

jQuery 提供多个与 AJAX 有关的方法。

通过 jQuery AJAX 方法,您能够使用 HTTP Get 和 HTTP Post 从远程服务器上请求文本、HTML、XML 或 JSON - 同时您能够把这些外部数据直接载入网页的被选元素中。

  • jQuery 不是生产者,而是大自然搬运工。
  • jQuery Ajax本质 XMLHttpRequest 或 ActiveXObject

注:2.+版本不再支持IE9以下的浏览器

1. jQuery.get(...)
       所有参数:
              url: 待载入页面的URL地址
             data: 待发送 Key/value 参数。
          success: 载入成功时回调函数。
         dataType: 返回内容格式,xml,json,script,text,html

2.jQuery.post(...)
       所有参数:
              url: 待载入页面的URL地址
             data: 待发送 Key/value 参数
          success: 载入成功时回调函数
         dataType: 返回内容格式,xml,128)">3.jQuery.getJSON(...)
       所有参数:
              url: 待载入页面的URL地址
             data: 待发送 Key/value 参数。
          success: 载入成功时回调函数。

4.jQuery.getScript(...)
       所有参数:
              url: 待载入页面的URL地址
             data: 待发送 Key/value 参数。
          success: 载入成功时回调函数。

5.jQuery.ajax(...)
       部分参数:
              url:请求地址
             type:请求方式,GET、POST(1.9.0之后用method)
          headers:请求头
             data:要发送的数据
      contentType:即将发送信息至服务器的内容编码类型(默认: "application/x-www-form-urlencoded; charset=UTF-8")
            async:是否异步
          timeout:设置请求超时时间(毫秒)
       beforeSend:发送请求前执行的函数(全局)
         complete:完成之后执行的回调函数(全局)
          success:成功之后执行的回调函数(全局)
            error:失败之后执行的回调函数(全局)
          accepts:通过请求头发送给服务器,告诉服务器当前客户端课接受的数据类型
         dataType:将服务器端返回的数据转换成指定类型
            xml": 将服务器端返回的内容转换成xml格式
           text": 将服务器端返回的内容转换成普通文本格式
           html": 将服务器端返回的内容转换成普通文本格式,在插入DOM中时,如果包含JavaScript标签,则会尝试去执行。
         script": 尝试将返回值当作JavaScript去执行,然后再将服务器端返回的内容转换成普通文本格式
           json": 将服务器端返回的内容转换成相应的JavaScript对象
          jsonp": JSONP 格式使用 JSONP 形式调用函数时,如 myurl?callback=?" jQuery 将自动替换 ? 为正确的函数名,以执行回调函数

写一个最简单的例子:

="XmlSendRequest();"='Ajax请求' /> ="text/javascript" src="jquery-1.12.4.js" JXmlSendRequest(){ $.ajax({ url: http://c2.com:8000/test/URL地址 type: GETtext(data,statusText,xmlHttpRequest){ // 成功后返回的结果 console.log(data); } }) } >

跨域ajax

由于浏览器存在同源策略机制,同源策略阻止从一个源加载的文档或脚本获取或设置另一个源加载的文档的属性。所以ajax本身是不可以跨域的,通过产生一个script标签来实现跨域。因为script标签的src属性是没有跨域的限制的。

浏览器同源策略并不是对所有的请求均制约:

  • 制约:XmlHttpRequest
  • 不制约:img、iframe、script等具有src属性的标签

注:自己模拟跨域,需要现在自己电脑的host文件里面添加两条域名,我这里添加的是zhangyanlin.com和aylin.com这两个域名

一、JSONP实现跨域请求

JSONP是一个非官方的协议,它允许在服务器端集成Script tags返回至客户端,通过javascript callback的形式实现跨域访问。jsonp只能通过get方式进行跨域请求

html >Titleinput ="Ajax"="DoAjax();"="JsonpAjax"="JsonpAjax();"="http://aylin.com:8002/statics/jquery.cookie.js" func(arg) { console.log(arg); // 输出结果就是python代码给传过来的列表[11,22,33,] } DoAjax() { $.ajax({ url: http://alex.com:8002/indexk1: v1},success: (arg) { console.log(arg); } }); } JsonpAjax() { var tag = document.createElement('script'); // tag.src = "http://alex.com:8002/index"; document.head.appendChild(tag); document.head.removeChild(tag); $.ajax({ url: http://aylin.com:8002/indexjsonpfunc // 对端给返回函数名,函数接收的参数是内容 }) } aylin.com域名这边可以给定义函数

# 采用pythontornado框架来进行的
class IndexHandler(tornado.web.RequestHandler):
    def get(self):
        self.write('func([11,33]);')
    def post(self,*args,**kwargs):
        self.write(t2.post')

在这里jsonp就采用script标签的src来进行跨域请求的

二、CORS

上面那种方法说到浏览器的同源策略导致ajax无法进行跨域传输,那么这种方法就可以突破浏览器限制来进行传输。当数据发送给对方域名的时候,对方已经收到,但是在返回的时候被浏览器给阻挡,我们可以写一串类似于身份证的字符串,通过浏览器的预检,从而达到数据的传输。

这方面分为简单请求和非简单请求

条件:
    1、请求方式:HEAD、GET、POST
    2、请求头信息:
        Accept
        Accept-Language
        Content-Language
        Last-event-id
        Content-Type 对应的值是以下三个中的任意一个
                                application/x-www-form-urlencoded
                                multipart/form-data
                                text/plain
 
注意:同时满足以上两个条件时,则是简单请求,否则为复杂请求

简单请求只一次请求,而复杂请求是两次请求,在发送数据之前会先发一次请求用于做“预检”,只有“预检”通过后才再发送一次请求用于数据传输。

基于cors实现AJAX请求:

1、支持跨域,简单请求

服务器设置响应头:Access-Control-Allow-Origin = '域名' 或 '*'

="submit"="XmlSendRequest();" ="JqSendRequest();"  XmlSendRequest(){
             XMLHttpRequest();
            xhr.onreadystatechange ) {
                     result  xhr.responseText;
                    console.log(result);
                }
            };
            xhr.open();
            xhr.send();
        }

         JqSendRequest(){
            $.ajax({
                url: >
class MainHandler(tornado.web.RequestHandler):
    def get(self):
        self.set_header('Access-Control-Allow-Origin',"http://www.xxx.com")
        self.write('{"status": true,"data": "seven"}')

2、支持跨域,复杂请求

由于复杂请求时,首先会发送“预检”请求,如果“预检”成功,则发送真实数据。

  • “预检”请求时,允许请求方式则需服务器设置响应头:Access-Control-Request-Method
  • “预检”请求时,允许请求头则需服务器设置响应头:Access-Control-Request-Headers
  • “预检”缓存时间,服务器设置响应头:Access-Control-Max-Age
PUThttp://aylin.com:8000/test/);
            xhr.setRequestHeader( 
 
class MainHandler(tornado.web.RequestHandler):
    
    def put(self):
        self.set_header('Access-Control-Allow-Origin',"data": "seven"}')

    def options(self,**kwargs):
        self.set_header('Access-Control-Allow-Origin',"http://www.xxx.com")
        self.set_header('Access-Control-Allow-Headers',"k1,k2")
        self.set_header('Access-Control-Allow-Methods',"PUT,DELETE")
        self.set_header('Access-Control-Max-Age',10)

3、跨域传输cookie

在跨域请求中,默认情况下,HTTP Authentication信息,Cookie头以及用户的SSL证书无论在预检请求中或是在实际请求都是不会被发送。

如果想要发送:

  • 浏览器端:XMLHttpRequest的withCredentials为true
  • 服务器端:Access-Control-Allow-Credentials为true
  • 注意:服务器端响应的Access-Control-Allow-Origin 不能是通配符 *
 xhr.responseText;
                    console.log(result);
                }
            };

            xhr.withCredentials ;

            xhr.open( 
 
class MainHandler(tornado.web.RequestHandler):
    
    def put(self):
        self.set_header('Access-Control-Allow-Origin',"http://www.xxx.com")
        self.set_header('Access-Control-Allow-Credentials',"true")
        
        self.set_header('xxoo',"seven")
        self.set_header('zhangyanlinhenshuai',"feichangshuai")
        self.set_header('Access-Control-Expose-Headers',"shuai,shuaishuai")

        self.set_cookie('kkkkk','vvvvv');

        self.write('{"status": true,10)

总结

以上是小编为你收集整理的Ajax----原生,jquery, 跨域:jsonp, cors全部内容。

如果觉得小编网站内容还不错,欢迎将小编网站推荐给好友。

ajax跨域 PHP中运用jQuery的Ajax跨域调用实现代码

ajax跨域 PHP中运用jQuery的Ajax跨域调用实现代码

可以在页面定义一个调用方法,如下:

复制代码 代码如下:

立即学习“PHP免费学习笔记(深入)”;


function getData(){
$.getJSON("http://123.123.123.123/?callback=?",
{
"m":"data",// 指定php的文件名字
"act":"getdata",// 指定php文件中的方法
"name":"问题儿童"// 传入的参数
},
function(data) {
// 获得返回值
}
});
}


对应链接下(123.123.123.123)的PHP文件,一般默认先调用index.php文件,通过index.php文件内的方法处理后,转到对应的php文件,并且找到对应的方法,执行之。
index.php代码如下:

复制代码 代码如下:

立即学习“PHP免费学习笔记(深入)”;


/**
* 入口文件
*/
$string = $_SERVER["REQUEST_URI"];// 获取访问的url
$m = get_m($string);
$file_path = "app/".$m.".php";
define(''IS_INDEX'',true);// 阻止直接访问app目录
require ($file_path);
/**
*
* 获取访问php文件
* @param string $url
*/
function get_m($url){
$strings = explode(''m='', $url);
$res = explode("&", $strings[1]);
return empty($res[0])?''index'':$res[0];
}
?>


data.php代码如下:

复制代码 代码如下:

立即学习“PHP免费学习笔记(深入)”;


/**
* data文件
*/
$act = !empty($_GET[''act'']) ? $_GET[''act''] : '''';
if ($act == ''getdata'')
{
$name = "我的名字叫:".$_REQUEST[''name''];
echo $_REQUEST["callback"]."(".json_encode($name).")";
}
?>


成功调用后,画面就能获取到返回的json数据了。

以上就介绍了ajax跨域 PHP中运用jQuery的Ajax跨域调用实现代码,包括了ajax跨域方面的内容,希望对PHP教程有兴趣的朋友有所帮助。

AJAX跨域与JSONP的一点实践经验

AJAX跨域与JSONP的一点实践经验

前几个周,项目中遇到了AJAX跨域的问题,然后找资料解决了。

首先要说明一点,关于AJAX的跨域原理和实践,我的经验还是比较少的,我只是大致看了下网上的资料,结合自己的理解,找到了解决办法,暂时不去仔细研究,因为要做的事情太多了,不可能把所有的问题都给研究透彻了。

问题场景:

a.com访问二级域名cms.a.com上的AJAX请求,遇到了跨域问题,Chrome-Firefox都没有问题,IE7-8-9都没有数据,直接报错了。貌似AJAX跨域不同浏览器的机制不一样。

网上有提到一种叫“JSONP”的技术,大概的意思是,我们可以直接修改<script src=""></script>的src属性,从而绕过AJAX跨域这个限制。

$.getJSON("http://cms.a.com/post/recentpost.json?jsoncallback=?",{count:count,categoryid:categoryid},function(data){
});
});

getJSON是jquery提供的API,专门用来获得JSON格式的数据,貌似是JSONP原理实现,尚未研究。

大致的思路是,在向后端发送请求的时候,多发送一个参数,即回调函数的名字,我自己取的名字是jsoncallback,后台响应方式:
//对外提供的服务接口
@RequestMapping(value = "recentpost")
public void recentPost(Integer categoryid,String jsoncallback,Integer count,Model model,HttpServletResponse response) {
List<Map<String,Object>> list = postService.listRecent(categoryid,count);
String str=JSONObject.toJSONString(list);
str =jsoncallback+"("+str+")";
super.returnMessage(response,str);
} 返回的格式是,myCallback({a:1,b:2}),myCallback是回调函数的值。
后端那个响应方法有点局限,应该需要做下判断,如果前端传入了jsoncallbak就按照jsonp的方式返回,如果是正常是非跨域AJAX请求,没有callback参数,就返回另外一种格式的数据。 参考资料: http://blog.csdn.net/hemingwang0902/article/details/4811064 http://www.cnblogs.com/dowinning/archive/2012/04/19/json-jsonp-jquery.html http://www.cnblogs.com/IT-Cristian/archive/2010/01/28/1658363.html http://blog.jobbole.com/53487/

Ajax跨域原理JQuery之Jsonp使用剖析

Ajax跨域原理JQuery之Jsonp使用剖析

Ajax跨域原理JQuery之Jsonp使用剖析技术

maybe yes 发表于2014-12-27 18:21

原文链接 : http://blog.lmlphp.com/archives/49 来自 : LMLPHP后院

有 关Ajax技术,对于我们这些经常在互联网打滚的人来说,已经是再熟悉不过了。关于Ajax原理,之前我也研究过,这里顺带解说一番。 JavaScript是一种基于事件的单线程执行脚本语言,要实现Ajax通信,必须先实例化 XMLHttpRequest 对象,然后对该对象的 onreadystatechange 注册事件,然后再执行 open 和 send 方法。一般来说,实现简单的Ajax请求,我们只需要在 readyState 等于 4(请求完成) 之后再进行后续的状态码判断并处理。对于IE浏览器,实现起来稍有不同,IE系列是使用 ActiveXObject 控件来实现异步请求的,不同版本的IE浏览器在写法上稍有不同,因此完整的Ajax类需要对IE系列浏览器做个判断,不过IE11之后已经不再是IE内核 了,此是后话。

Ajax技术是遵循同源策略的,所有的浏览器都是如此。试想,如果可以随意请求别的网站的资源,互联网不就乱套了吗。通过安 装浏览器插件使用 background 技术也可以实现跨域并与外部进行通信,著名的360网页抢票插件就是这么实现的。在现实的需求中,经常会需要跨域,Ajax不可以,HTML的一些其他的 标签,比如 IMG,LINK,SCRIPT等都是可以的,万维网的设计者们在这一点上还是放松了,不过这样确实带来不少方便。著名的JSONP技术,就是通过SCRIPT标签来实现请 求外部资源,网上很多的文章和帖子都说成了“Ajax跨域”,其实这样已经不再是Ajax技术了。

Jsonp虽然能够很方便的请求外部资 源,实现跨域与服务端通信,但也有所限制的。这种限制要求服务端返回的内容必须是合法的 JavaScript 代码,一般都需要配合客户端的要求返回相应的回调函数。之前本人每次使用Jsonp实现跨域,都是动态的创建SCRIPT标签,然后发出请求,虽然知道 JQuery也有提供这样的功能,之前感觉使用起来很是麻烦。最近使用JQuery的Ajax方法,才发现它封装的比较好,JQuery每次发给服务端的 函数名都是唯一的,这点确实避免了复杂环境下容易出错的问题。

附上使用JQuery实现Jsonp代码示例,下面的代码每次请求都是以 jsonpcallback 作为参数名发送一个类似于“jQuery21102093567821251967_1419672602306”这样的唯一的函数名给服务端,服务端以 这个名称返回回调函数和数据:

<script>
$.ajax({
	url:'url',dataType:"jsonp",jsonp:"jsonpcallback",success:function(data){
		custom_callback(data);
	}
});
</script>

阅(33)评(0)查看评论

我们今天的关于AJAX跨域 jQuery JSONP 实践ajax jsonp跨域请求的分享已经告一段落,感谢您的关注,如果您想了解更多关于Ajax----原生,jquery, 跨域:jsonp, cors、ajax跨域 PHP中运用jQuery的Ajax跨域调用实现代码、AJAX跨域与JSONP的一点实践经验、Ajax跨域原理JQuery之Jsonp使用剖析的相关信息,请在本站查询。

本文标签: