探秘ajax跨域请求

 更新时间:2015年03月13日 10:04:48   投稿:hebedich  
本文讲解的是怎么利用ajax实现跨域请求,那么知道“同源策略”,就可以解决很多疑问:“为毛我的ajax加载不了数据!”“为毛浏览器控制台会对我如此漂亮的代码报错!”这就是我们今天要主要探讨的内容了。

前言

ajax,用苍白的话赞扬:很好。

我们可以使用ajax实现异步获取数据,减少服务器运算时间,大大地改善用户体验;我们可以使用ajax实现小系统组合大系统;我们还可以使用ajax实现前端的优化。(好一个排比)

虽然ajax很好,但在使用起来也会有一定的限制,出于安全考虑,不允许跨域通信。如果尝试从不同的域请求数据,会出现安全错误。(下面例子1可以直观看出)

同源策略限制

同源策略阻止从一个域上加载的脚本获取或操作另一个域上的文档属性。也就是说,受到请求的 URL 的域必须与当前 Web 页面的域相同。这意味着浏览器隔离来自不同源的内容,以防止它们之间的操作。这个浏览器策略很旧,从 Netscape Navigator 2.0 版本开始就存在。——摘自developerWorks
所谓同源是指,域名,协议,端口相同。

平地一声吼

本文讲解的是怎么利用ajax实现跨域请求,那么知道“同源策略”,就可以解决很多疑问:“为毛我的ajax加载不了数据!”“为毛浏览器控制台会对我如此漂亮的代码报错!”

例子1
先上一个错误示范

客户端代码:

复制代码 代码如下:

<script>
    // 客户端使用getJSON方法请求另一台机子上的脚本
    $.getJSON("http://172.22.22.120/new/ajax.php",function(json){
        alert(json.website);
    });
</script>

服务端PHP脚本代码:

复制代码 代码如下:

<?php
    // ajax.php
    header('Content-type: application/json');

    echo json_encode(array('website'=>'hcoding'));
?>

firefox下的错误提示:

根据同源策略的概念,localhost和172.22.22.120是出于不同的域名下的,所以跨域请求理所当然地被浏览器拒绝了。

JSONP

JSONP(JSON with Padding)是资料格式 JSON 的一种“使用模式”,可以让网页从别的网域要资料。另一个解决这个问题的新方法是跨来源资源共享。由于同源策略,一般来说位于 server1.example.com 的网页无法与不是 server1.example.com 的服务器沟通,而 HTML 的 <script> 元素是一个例外。利用 <script> 元素的这个开放策略,网页可以得到从其他来源动态产生的 JSON 资料,而这种使用模式就是所谓的 JSONP。用 JSONP 抓到的资料并不是 JSON,而是任意的 JavaScript,用 JavaScript 直译器执行而不是用 JSON 解析器解析。——摘自维基百科
这话该怎么理解呢!我个人是这样认为的,用<script>跨域的请求数据,跨域的服务器返回一段【JavaScript代码】,是 的,你没看错,不是json格式数据,是JavaScript代码,这样,这段代码就由JavaScript 直译器执行。上例子更直观:

例子2
客户端代码:

复制代码 代码如下:

<script>
    // 这是回调方法
    function cb(data){
        alert(data.website);
    }
</script>
<!--这是跨域请求的代码,切记,这段代码要在回调函数之后-->
<script src="http://172.22.22.120/new/ajax_jsonp.php?callback=cb"></script>

服务端PHP脚本代码:

复制代码 代码如下:

<?php
    $cb = htmlspecialchars($_GET['callback']);  // 注意了,这里要做好过滤,防止xss攻击
    echo $cb,'(',json_encode(array('website'=>'hcoding')),')';  // 返回客户端的数据为:cb({"name":"hcoding"})  这是一段js代码
?>

浏览器会发生什么事呢,我就不说了,当然是cb方法被调用啦:

所以,再说jsonp的概念,利用<script>不受同源策略的限制,跨域的服务器把要返回的json数据作为参数和回调函数一起返回客户端。

JQuery对JSONP的支持

本文要讲ajax的跨域请求,前面说了那么多,下面当然要讲主题啦。

从 1.2 版本开始,jQuery 拥有对 JSONP 回调的本地支持。如果指定了 JSONP 回调,就可以加载位于另一个域的 JSON 数据,回调的语法为:url?callback=?。jQuery 自动将 ? 替换为要调用的生成函数名。

例子3:$.getJSON方法跨域请求
例子4:$.ajax方法自定义回调方法
例子3
客户端代码:

复制代码 代码如下:

<script>
    // 客户端使用getJSON方法请求另一台机子上的脚本
    // 浏览器会生成一个随机的callback参数
    $.getJSON("http://172.22.22.120/new/ajax_jsonp.php?callback=?",function(json){
        alert(json.website);
    });
</script>

服务端PHP脚本代码:

复制代码 代码如下:

<?php
    $cb = htmlspecialchars($_GET['callback']);  // 注意了,这里要做好过滤,防止xss攻击
    echo $cb,'(',json_encode(array('website'=>'hcoding')),')';  // 返回客户端的数据,这是一段js代码
?>

$.getJSON简单易用,但就是不能指定回调函数。

例子4
客户端代码:

复制代码 代码如下:

<script>
    $.ajax({
        type : "GET",
        url : "http://172.22.22.120/new/ajax_jsonp.php",
        dataType : "jsonp",    // 数据格式指定为jsonp
        jsonp: "callback",     // 服务点通过这个键值获取回调方法
        jsonpCallback:"cb",   // 指定回调方法
        success : function(json){
        },
    }); 
    // 回调方法
    function cb(data){
        alert(data.website);
    }
</script>

服务端PHP脚本代码和例子3的相同。

总结

正所谓无规矩不成方圆,以安全为出发点,遵循同源策略是一个好品德。但我们也有跨域请求的需求,jsonp就能满足我们的需求。当然跨域请求还有很多的方法,不单止jsonp。

以上所述就是本文的全部内容了,希望大家能够喜欢。

相关文章

  • axios和ajax的区别点总结

    axios和ajax的区别点总结

    在本篇文章里小编给大家整理的是一篇关于axios和ajax的区别点总结内容,对此有兴趣的朋友们可以跟着学习下。
    2021-12-12
  • 揭开AJAX神秘的面纱(AJAX个人学习笔记)

    揭开AJAX神秘的面纱(AJAX个人学习笔记)

    写这个学习笔记,只是记载一下自己的学习经过和体会,把一些学习重点记录下来,以备今后的巩固复习及应用,很多知识点没有详细介绍,所以并不完全适用于初学者,如果你是初学者,最好选择一本AJAX学习的书籍,然后与这篇学习笔记对照学习,效果会更好。
    2009-09-09
  • 如何解决JQuery ajaxSubmit提交中文乱码

    如何解决JQuery ajaxSubmit提交中文乱码

    本文给大家分享jquery ajax submit提交中文乱码问题的解决办法,感兴趣的朋友跟着脚本之家的小编一起来学习吧
    2015-09-09
  • IE浏览器与FF浏览器关于Ajax传递参数值为中文时的区别实例分析

    IE浏览器与FF浏览器关于Ajax传递参数值为中文时的区别实例分析

    这篇文章主要介绍了IE浏览器与FF浏览器关于Ajax传递参数值为中文时的区别,结合实例分析说明了ajax参数传递过程中的参数转码相关注意事项与使用技巧,需要的朋友可以参考下
    2015-12-12
  • AJAX应用中必须要掌握的重点知识(分享)

    AJAX应用中必须要掌握的重点知识(分享)

    下面小编就为大家带来一篇AJAX应用中必须要掌握的重点知识(分享)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-08-08
  • bootstrap select2 动态从后台Ajax动态获取数据的代码

    bootstrap select2 动态从后台Ajax动态获取数据的代码

    这篇文章主要介绍了bootstrap select2 动态从后台Ajax动态获取数据的代码,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-12-12
  • Ajax实现的异步传输与验证示例代码

    Ajax实现的异步传输与验证示例代码

    Ajax异步传输应用很广当用户注册时,当用户刚一输完,立即判断用户是否存在这就用到了异步传输
    2014-01-01
  • Ajax + PHP session制作购物车

    Ajax + PHP session制作购物车

    这篇文章主要为大家详细介绍了Ajax结合PHP session制作购物车,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-06-06
  • 基于HTML5 Ajax文件上传进度条如何实现(jquery版本)

    基于HTML5 Ajax文件上传进度条如何实现(jquery版本)

    本文给大家介绍基于html5 ajax文件上传进度条是如何实现的,涉及到html5新增加的formdata对象的使用,对html5文件上传进度条感兴趣的朋友一起学习吧
    2015-11-11
  • ztree+ajax实现文件树下载功能

    ztree+ajax实现文件树下载功能

    这篇文章主要为大家详细介绍了ztree+ajax实现文件树下载功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-05-05

最新评论