利用JSONP实现跨域请求

  前言:有时候一忙起来就没了时间观念,原来我已经有十多天没写博客了。一直想做跨域方面的尝试,无奈最近准备校招没时间动动手。今天就先讲讲JSONP吧,昨晚还在研究QQ空间日志里面网络图片的问题呢,我发现日志还提供了HTML模式,我们可以利用img标签的src属性实现跨域请求,从自己的服务器里提取动态内容。

JSONP

在讲实现之前,我们先来看看何为JSONP。以下是维基百科的解释:

JSONP or "JSON with padding" is a communication technique used in JavaScript programs running in web browsers to request data from a server in a different domain, something prohibited by typical web browsers because of the same-origin policy. JSONP takes advantage of the fact that browsers do not enforce the same-origin policy on <script> tags. Since it works through <script> tags, JSONP supports only the GET request method. There are significant security implications and risks associated to using JSONP; unless you have no choice, CORS is usually the better choice.

我粗陋翻译一下:JSONP又称JSON with padding,它是用在浏览器上运行的JS程序里的一项交互技术,目的是为了从不同的服务器域名上请求数据。由于同源政策的限制,部分功能会受到浏览器的禁止。JSONP利用的是浏览器不会对<script>标签实施同源政策的情况。又因为它是通过<script>作用的,所以JSONP只支持GET请求方式。但值得注意的是,使用JSONP会存在安全隐患和危险。CORS(跨域资源共享,Cross-Origin Resource Sharing)是一个更为常用的佳选,除非你没得选。

解释:  

简单来说就是,一般情况下,在本域名的页面想要获取其他域名下的数据是会受到限制的。但是在HTML页面中的<script>(img,iframe亦可)就突破了这种限制,可以通过src属性来访问其他域名并获得返回的数据,但这种方法并不安全,只能通过GET方法获取。

其实我们平常稍加留意,就不难发现其实我们平常在页面中使用CDN也是这个原理,我们的页面同样可以访问其他服务器上的JS文件。

如我们常用的百度CDN,我们通常在<head>里面加上是<script>标签就可以使用其他服务器的CDN。

<script src="http://apps.bdimg.com/libs/jquery/2.1.4/jquery.js"></script>

只不过稍有不同的是现在变为向服务器运行文件请求数据,然后再以JavaScript的形式返回。

客户端实现:

JSONP是一种非正式传输协议,具体传输内容以及格式可以由用户自己定义。不过我觉得JSONP可能会在ES6中新增也说不定哦,到时候可能会规范传输格式。JSONP其中有一个要点就是允许用户传递一个callback参数给服务端,然后服务端输出的数据作为callback的参数再一并返回到客户端页面,最后根据参数在客户端页面执行这个回调函数,最终达到返回数据并处理的目的。

代码形式如下:

  <head>
      <meta charset="UTF-8">
      <title>JSONP</title>
      <script type="text/javscript">
          var cbFn = function(str){
              alert(str);
          }
      </script>
      <script src="http://www.sp0.baidu.com?data=value&cb=cbFn"></script>
 </head>

首先要预定义一个回调函数,用于处理返回数据;其次请求数据的<script>标签的src要传递请求参数以及回调的函数名字到后台,这一点要沟通协调好。

由于在实际应用中请求地址、请求参数以及次数都是不固定的,所以我们要把JSONP封装成一个函数,增强灵活性和复用性。

    var s1;
    function jsonp(url,data,cb){
      data.cb = cb?cb:"callback";
      data.t = new Date().getTime();
      for (var i in data){
          var str = i+"="+data[i];
          arr.push(str);
     }
    var str = url+"?"+arr.join("&");
    var headEl = document.getElementsByTagName("head")[0];
    if (s1){
          headEl.removeChild(s1);
    }   
    s1 = document.createElement("script");
    s1.src = str;
    headEl.appendChild(s1);
}

代码解释:首先给传递的数据中插入一个回调函数名和一个新的时间参数值,让后台获取你要回调的函数名以及防止调用缓存。接下来就是判断之前已经是否发送过JSONP请求,如果存在,则删除重建。

服务端实现:

假设我在客户端执行了以下请求

 jsonp("http://www.chengguanhui.com/test.php",{
     name:"ray",
     age:23
 },"cbFn");
 
 cbFn(str){
     alert(str);
 }

那么HTTP传递的URL为http://www.chengguanhui.com/test.php?name=ray&age=23cb=cbFn&t=242566(某个不定时间值)

PHP代码:

 <?php
     require_once("common.php");
     $name = $_GET['name'];
     $age = $_GET['age'];
     $cb = $_GET['cb'];
     $str = $name.$age;
     echo $cb."(".$str.")";
 ?>

客户端接收到cbFn("ray23")并弹出对应内容。

 JQ实现:

$.ajax(url,[settings])

   $.ajax({
               type: "get",
               url: "http://www.chengguanhui.com/test.php",
               dataType: "jsonp",
               data: "name=ray&age=23",
               jsonp: "callback",//传递给请求处理程序或页面的,用以获得jsonp回调函数名的参数名(一般默认为:callback)
               jsonpCallback:"handleFn",//自定义的jsonp回调函数名称,默认为jQuery自动生成的随机函数名,也可以写"?",jQuery会自动为你处理数据
               success: function(json){
                  alert(json.name+json.age);
              },
              error: function(){
                  alert('fail');
              }
          });
      });

 

$.getJSON(url,data,callback)

  $.getJSON("http://www.chengguanhui.com/test.php",//如果请求值固定时,可以省略data参数而直接写在url参数里。
      {
      name:ray,
      age:23
  },
  function(data){
    $.each(data.items, function(i,item){
       alert(i+item);
    });
 });

 

时间: 2024-10-28 08:16:05

利用JSONP实现跨域请求的相关文章

使用jsonp完成跨域请求,但是请求的链接是js文件,请求总是那个js报错,怎莫办?

问题描述 使用jsonp完成跨域请求,但是请求的链接是js文件,请求总是那个js报错,怎莫办? 把链接换成php就没问题. $.ajax({ type:'GET', async:false, url:"http://app.veishu.com/jsonp/categories/all.js", dataType:"jsonp", success:function(data){ alert("success"); // alert(data[0]

js中利用JSONP解决跨域问题

什么是跨域? 简单的来说,出于安全方面的考虑,javascript不能访问其他服务器上的内容,即"同源策略"(参考1,参考2).跨域就是通过某种手段绕过同源策略去访问不同服务器上的内容.只要域名.端口.协议任何一个不同,就是不同的域.协议或端口不同只能通过后端来解决. URL 说明 是否允许通信 http://www.a.com/a.js http://www.a.com/b.js 同一域名下 允许 http://www.a.com/lab/a.js http://www.a.com/

来说说SpringMVC + JSONP的跨域请求

先来说说场景,JSON,这货大家应该都懂,不懂的请自动面壁思过,那么什么是JSONP,不是JSON放了个P就叫JSONP,而是JSON with Padding,在进行跨域请求的时候需要的数据,什么是跨域,打个比方:在user.weixin.com下的某个页面下,用户服务需要调用订单服务,请求order.weixin.com,那么在这两个二级域名下,请求是互斥的,如果请求就会报错.   先来看看本域下的请求,同域名下是可以获取到json数据的     那么如果换一个域名呢?可以看到请求被拒绝了,

Jquery利用getScript实现跨域请求数据

先来看看getScript()用法. getScript() 方法通过 HTTP GET 请求载入并执行 JavaScript 文件. 参数 描述 url 将要请求的 URL 字符串. success(response,status) 可选.规定请求成功后执行的回调函数. 额外的参数: response - 包含来自请求的结果数据 status - 包含请求的状态("success", "notmodified", "error", "

Ajax jsonp跨域请求实现方法_AJAX相关

什么是跨域? 简单的来说,出于安全方面的考虑,页面中的JavaScript无法访问其他服务器上的数据,即"同源策略".而跨域就是通过某些手段来绕过同源策略限制,实现不同服务器之间通信的效果. 具体策略限制情况可看下表:   URL 说明 允许通信 http://www.a.com/a.js http://www.a.com/b.js 同一域名下 允许 http://www.a.com/lab/a.js http://www.a.com/script/b.js 同一域名下不同文件夹 允许

前端跨域请求原理及实践

一. 跨域请求的含义 浏览器的同源策略,出于防范跨站脚本的攻击,禁止客户端脚本(如 JavaScript)对不同域的服务进行跨站调用. 一般的,只要网站的 协议名protocol. 主机host. 端口号port 这三个中的任意一个不同,网站间的数据请求与传输便构成了跨域调用.这也是我们下面实践的理论基础.我们利用 NodeJs 创建了两个服务器,分别监听 3000. 3001 端口(下面简称 服务器3000 与 服务器3001 ),由于端口号不一样,这两个服务器以及服务器上页面通信构成了跨域请

探秘ajax跨域请求_AJAX相关

前言 ajax,用苍白的话赞扬:很好. 我们可以使用ajax实现异步获取数据,减少服务器运算时间,大大地改善用户体验:我们可以使用ajax实现小系统组合大系统:我们还可以使用ajax实现前端的优化.(好一个排比) 虽然ajax很好,但在使用起来也会有一定的限制,出于安全考虑,不允许跨域通信.如果尝试从不同的域请求数据,会出现安全错误.(下面例子1可以直观看出) 同源策略限制 同源策略阻止从一个域上加载的脚本获取或操作另一个域上的文档属性.也就是说,受到请求的 URL 的域必须与当前 Web 页面

ajax跨域请求学习笔记

原文:ajax跨域请求学习笔记 前言 ajax,用苍白的话赞扬:很好. 我们可以使用ajax实现异步获取数据,减少服务器运算时间,大大地改善用户体验:我们可以使用ajax实现小系统组合大系统:我们还可以使用ajax实现前端的优化.(好一个排比) 虽然ajax很好,但在使用起来也会有一定的限制,出于安全考虑,不允许跨域通信.如果尝试从不同的域请求数据,会出现安全错误.(下面例子1可以直观看出) 同源策略限制 同源策略阻止从一个域上加载的脚本获取或操作另一个域上的文档属性.也就是说,受到请求的 UR

探秘ajax跨域请求

前言 ajax,用苍白的话赞扬:很好. 我们可以使用ajax实现异步获取数据,减少服务器运算时间,大大地改善用户体验:我们可以使用ajax实现小系统组合大系统:我们还可以使用ajax实现前端的优化.(好一个排比) 虽然ajax很好,但在使用起来也会有一定的限制,出于安全考虑,不允许跨域通信.如果尝试从不同的域请求数据,会出现安全错误.(下面例子1可以直观看出) 同源策略限制 同源策略阻止从一个域上加载的脚本获取或操作另一个域上的文档属性.也就是说,受到请求的 URL 的域必须与当前 Web 页面