实例操作JSONP原理

絮语:按这个步骤走,你就会明白JSONP是什么鬼。

1.工程目录:


ng-mywork
    80
        demo.html
    90
        test.js

2.nginx的server配置


server {
        listen       80;
        server_name  scan_80;

        root E:/ng-mywork/80;

        location / {

        }

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

    }

    server {
        listen 90;
        server_name scan_90;

        root E:/ng-mywork/90;

        location / {

        }

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }

配置了两个域名不同,端口不同的域。

不会配置?

请看:nginx+php的使用

   nginx的使用

3.get的xhr的异步请求


//XMLHttpRequest
// true:异步请求
//监听onreadystatechange事件句柄
//设置timeout,回调
    var xhr = new XMLHttpRequest();
    xhr.open(‘get‘, ‘http://scan_90:90/test.js‘, true);
    xhr.onreadystatechange = function(){
      if(xhr.readyState === 4){
        if(xhr.status === 200){
          alert("请求成功!")
        }
      }
    }
    xhr.ontimeout = function(){
      alert("请求超时")
    }
    xhr.timeout = 1000;
    xhr.send(null);

谷歌下请求没问题,因为我设置对浏览器设置了跨域参数。

但是火狐确是不行的,因为是跨域。

4.get的xhr的同步请求


//不能设置超时 因为系统会默认设置为0
    var xhr = new XMLHttpRequest();
    xhr.open(‘GET‘, ‘http://scan_90:90/test.js‘, false);
    xhr.send(null);
    if(xhr.readyState === 4){
      if(xhr.status === 200){
        alert("请求成功")
      }

注意这里的超时注释,同步是不能设置的。

5.使用jsonp进行跨域解决不能跨域请求的问题


//进行jsonp跨域请求
    var script = document.createElement(‘script‘);
    script.src = ‘http://scan_90:90/test.js?callback=dothings‘;
    script.type = "text/javascript";
    document.body.insertBefore(script, document.body.children[0]);

请求成功了,但是好像跟我们想象的是有点区别的?因为我们常见的返回是这样的。

dothings([1,2,3]);

//然后我们可以调用:
function dothings(arr){
    //....
}

那是因为这不只是前端做的,还有服务端也需要做些修改来配合返回值。

增加php文件:

<?php
    $callback = $_GET[‘callback‘];
    $data = array(‘1‘,‘2‘,‘3‘);
    echo $callback.‘(‘.json_encode($data).‘)‘;
?>

改下js:

var script = document.createElement(‘script‘);
    script.src = ‘http://scan_90:80/test.php?callback=dothings‘;
    script.type = "text/javascript";
    document.body.insertBefore(script, document.body.children[0]);

    //请求完毕后立即执行dothings
    function dothings(arr) {
        console.log(arr)
    }

OK,大功告成!

总结:jsonp的跨域使用的就是script可以跨域的特性(还有其他很多标签都可跨域,如img)。通过服务端跟前端的配合使得返回的js是我们定义的方法,以便可以在前端调用执行。

时间: 2024-08-25 22:08:29

实例操作JSONP原理的相关文章

Java JUC之Atomic系列12大类实例讲解和原理分解

Java JUC之Atomic系列12大类实例讲解和原理分解 2013-02-21      0个评论       作者:xieyuooo 收藏    我要投稿 在java6以后我们不但接触到了Lock相关的锁,也接触到了很多更加乐观的原子修改操作,也就是在修改时我们只需要保证它的那个瞬间是安全的即可,经过相应的包装后可以再处理对象的并发修改,以及并发中的ABA问题,本文讲述Atomic系列的类的实现以及使用方法,其中包含: 基本类:AtomicInteger.AtomicLong.Atomic

Ajax跨域:Jsonp原理解析

推荐先看下这篇文章:JS跨域(ajax跨域.iframe跨域)解决方法及原理详解(jsonp) JavaScript是一种在Web开发中经常使用的前端动态脚本技术.在JavaScript中,有一个很重要的安全性限制,被称为“Same-Origin Policy”(同源策略).这一策略对于JavaScript代码能够访问的页面内容做了很重要的限制,即JavaScript只能访问与包含它的文档在同一域下的内容. JavaScript这个安全策略在进行多iframe或多窗口编程.以及Ajax编程时显得

AJAX(六)jsonp原理详解

一.什么是jsonp? 先别管什么叫jsonp,我们先来看一个小问题,看完这个问题你就知道jsonp是要解决什么问题的,自然也就明白什么是jsonp了. 问题: 之前做的例子如果在同一个域名下运行时是非常正常的,但如果这个数据接口是在A域名下,而使用了AJAX请求的静态页运行在B域名下,我们就会发现点击按钮发出请求时会报错.截个图来看看. 我们看到后台的一般处理程序运行的域名是 : http://localhost:64113 现在使用VS重新创建1个web项目,然后在这个使用AJAX方式发出请

跨域及JSONP原理

什么是跨域:a.com 域名下的js无法操作b.com或是c.a.com域名下的对象 为什么浏览器要引入跨域问题? 跨域问题来源于浏览器的同源策略,为啥要有这个策略呢? 为了安全.假设现在有a.com 和b.com 两个域,如果没有同源策略的限制,那么a.com就可以随随便便就去b.com 里面拿东西,甚至一些cookie信息(常用于存储登录信息),那么a.com只需要一段代码就可以获取你的cookie信息,从而冒充你的身份去登录网站. 当使用 AJAX 跨域访问资源 会受到同源策略影响,浏览器

Winform开发框架里面使用事务操作的原理及介绍

在很多情况下,事务是个很有用的东西,可以把一系列的操作组合成一个原子粒度的操作,一旦组合中某个地方出错,可以整个干净的进行滚回,不会留下脏数据:除此之外,事务还能提高批量操作的效率,如在本地SQLite数据库里面,批量插入1万条数据,那么使用事务和没有使用事务,速度上至少差别几十到上百倍的差异.既然事务有完整性和速度性的差异,因此,基于上述原因,我们在很多情况下最好使用事务进行操作.本文主要介绍在开发框架中如何整合事务的操作,并介绍在各个分层中的事务使用案例. 由于我介绍的相关框架,主要是采用了

QSqlQueryModel的实例操作

QSqlQueryModel类为SQL的结果集提供了一个只读的数据模型,下面我们先利用这个类进行一个最简单的操作. 我们新建Qt4 Gui Application工程,我这里工程名为queryModel ,然后选中QtSql模块,Base class选QWidget.工程建好后,添加C++ Header File ,命名为database.h,更改其内容如下: 1.           #ifndef DATABASE_H   2.             3.           #defin

JSONP原理及jQuery中的使用

JSONP原理 JSON和JSONP JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,用于在浏览器和服务器之间交换信息. JSONP(JSON With Padding),就是打包在函数调用中的的JSON(或者包裹的JSON). JSON是一种数据格式,JSONP是一种数据调用方式. 1 //JSON 2 3 { 4 5 “name”: “sb” 6 7 } 1 //JSONP 2 3 callback({ 4 5 “name”: “sb” 6 7 }

[Sqlite]--&gt;嵌入式数据库事务理解以及实例操作

SQLite 事务(Transaction) 事务(Transaction)是一个对数据库执行工作单元.事务(Transaction)是以逻辑顺序完成的工作单位或序列,可以是由用户手动操作完成,也可以是由某种数据库程序自动完成. 事务(Transaction)是指一个或多个更改数据库的扩展.例如,如果您正在创建一个记录或者更新一个记录或者从表中删除一个记录,那么您正在该表上执行事务.重要的是要控制事务以确保数据的完整性和处理数据库错误. 实际上,您可以把许多的 SQLite 查询联合成一组,把所

Linux DNS视图脑裂的实例操作(四)

DNS视图 bind view:  视图,脑裂(split-brain)双线接入.如:电信和联通双线接入  根据客户端来源的不同,将同一个名称解析至不同的地址: 案例:我们接下来配置内外网双向解析DNS服务器:同一个名称解析,分配给不同的IP地址 实验条件:我们这里为了方便理解操作直接在服务器上添加了两块网卡,(实际操作中只要能和DNS服务器能通信即可)实际操作如下!! 我们是讲解的方法:方便操作设置以下地址(你懂得.)   实例: 主配置:主配置文件主要设置,把根域复制到辅配置文件中,看配置文