详细解密jsonp跨域请求


Posted in Javascript onApril 15, 2015

1.什么是跨域请求:

服务器A上的一个页面,要请求服务器B上的一个处理程序,这就叫做跨域请求

本次的测试页面为:

处理程序kimhandler.ashx,如下:

%@ WebHandler Language="C#" Class="KimHandler" %>

using System;
using System.Web;

public class KimHandler : IHttpHandler {
  
  public void ProcessRequest (HttpContext context)
  {
    string msg = "{\"name\":\"kim\",\"gender\":\"男\",\"age\":24}";
    context.Response.Write(msg);
  }
 
  public bool IsReusable {
    get {
      return false;
    }
  }
}

另一张处理程序handler.ashx如下:

<%@ WebHandler Language="C#" Class="Handler" %>

using System;
using System.Web;

public class Handler : IHttpHandler {
  
  public void ProcessRequest (HttpContext context)
  {
    string callbackName = context.Request.Params["callbackFun"];
    string msg = callbackName+ "({\"name\":\"kim\",\"age\":\"18\"});";
    context.Response.Write(msg);
  }
 
  public bool IsReusable {
    get {
      return false;
    }
  }

}

2.Ajax无法实现跨域请求

<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
  <title></title>
  <script>
    var requestUrl = "http://qxw1192430265.my3w.com/kimhandler.ashx";
    window.onload = function () {
      document.getElementById("btnAjax").onclick = function() {
        var xhr = new XMLHttpRequest();
        xhr.open("get", requestUrl, true);
        xhr.setRequestHeader("If-Modified-Since", 0);
        xhr.onreadystatechange = function () {
          if (xhr.readyState == 4 && xhr.status == 200) {
            var res = xhr.responseText;
            alert(res);
          }
        }
        xhr.send(null);
      }
    }
  </script>
</head>
<body>
  <input type="button" id="btnAjax" value="点击" />
</body>
</html>

查看监视器,发现没有返回任何请求报文体

详细解密jsonp跨域请求

3.使用script标签,可以实现跨域请求

测试代码如下:

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
  <title></title>
  <script src="http://qxw1192430265.my3w.com/kimhandler.ashx"></script>
</head>
<body>

</body>
</html>

查看监视器,可以看到,有返回请求报文体

详细解密jsonp跨域请求

在用json格式看下

详细解密jsonp跨域请求

4.使用js方式,在浏览器端,读取响应是数据

测试代码如下,注意换了一个处理程序

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
  <title></title>
  <script>
    function getData(data) {
      for (var key in data) {
        alert(data[key]);
      }
    }
  </script>
  <script src="http://qxw1192430265.my3w.com/handler.ashx?callbackFun=getData"></script>
 </head>
<body>
  
</body>
</html>

通过后台代码,可知

详细解密jsonp跨域请求

然后在监视器上看看

详细解密jsonp跨域请求

详细解密jsonp跨域请求

发现在浏览器端,弹出了kim还有18

5.使用Jq来实现跨域请求(内部原理就是为我们创建了一个script标签)

代码如下

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
  <title></title>
  <script src="jquery-1.9.0.js"></script>
  <script>
    var requestUrl = "http://qxw1192430265.my3w.com/handler.ashx";
    window.onload = function () {
      document.getElementById("btnJq").onclick = function() {
        $.ajax(requestUrl, {
          type: "get", //请求方式
          dataType: "jsonp", //数据发送类型
          jsonp: "callbackFun", //服务器端接收的参数
          jsonpCallback: "fun", //js处理方法
          success: function () {
            alert("成功");
          }
        });
      }
    }

    function fun(data) {
      for (var key in data) {
        alert(data[key]);
      }
    }
  </script>
</head>
<body>
  <input type="button" id="btnJq" value="Jq按钮" />
</body>
</html>

点击按钮后,可以看到效果,再看下监视器

详细解密jsonp跨域请求

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

Javascript 相关文章推荐
[原创]静态页面也可以实现预览 列表不同的显示方式
Oct 14 Javascript
javascript 鼠标悬浮图片显示原图 移出鼠标后原图消失(多图)
Dec 28 Javascript
jQuery中jqGrid分页实现代码
Nov 04 Javascript
javascript移动设备Web开发中对touch事件的封装实例
Jun 05 Javascript
js识别uc浏览器的代码
Nov 06 Javascript
JavaScript中使用数组方法汇总
Feb 16 Javascript
AngularJS ng-bind-template 指令详解
Jul 30 Javascript
jQuery的三种bind/One/Live/On事件绑定使用方法
Feb 23 Javascript
Vuejs开发环境搭建及热更新【推荐】
Sep 07 Javascript
详解React中合并单元格的正确写法
Jan 08 Javascript
vue项目添加多页面配置的步骤详解
May 22 Javascript
基于layui框架响应式布局的一些使用详解
Sep 16 Javascript
jQuery插件zoom实现图片全屏放大弹出层特效
Apr 15 #Javascript
javascript中Math.random()使用详解
Apr 15 #Javascript
js数组依据下标删除元素
Apr 14 #Javascript
js获取数组的最后一个元素
Apr 14 #Javascript
jQuery实现鼠标划过修改样式的方法
Apr 14 #Javascript
jquery仿百度经验滑动切换浏览效果
Apr 14 #Javascript
jQuery获得子元素个数的方法
Apr 14 #Javascript
You might like
DC四月将推出百页特刊漫画 纪念小丑诞生80周年
2020/04/09 欧美动漫
php目录管理函数小结
2008/09/10 PHP
使用bcompiler对PHP文件进行加密的代码
2010/08/29 PHP
PHP异步调用socket实现代码
2012/01/12 PHP
PHP+iFrame实现页面无需刷新的异步文件上传
2014/09/16 PHP
Thinkphp实现站点静态化的方法详解
2017/03/21 PHP
php基于 swoole 实现的异步处理任务功能示例
2019/08/13 PHP
php定期拉取数据对比方法实例
2019/09/22 PHP
yii框架结合charjs实现统计30天数据的方法
2020/04/04 PHP
16个最流行的JavaScript框架[推荐]
2011/05/29 Javascript
THREE.JS入门教程(2)着色器-上
2013/01/24 Javascript
浅析jquery的js图表组件highcharts
2014/03/06 Javascript
jquery实现鼠标滑过小图查看大图的方法
2015/07/20 Javascript
jQuery简单实现点击文本框复制内容到剪贴板上的方法
2016/08/01 Javascript
JavaScript中原型链存在的问题解析
2016/09/25 Javascript
js正则表达式验证密码强度【推荐】
2017/03/03 Javascript
Node.js+jade+mongodb+mongoose实现爬虫分离入库与生成静态文件的方法
2017/09/20 Javascript
原生JS实现图片无缝滚动方法(附带封装的运动框架)
2017/10/01 Javascript
vue2.0父子组件间传递数据的方法
2018/08/16 Javascript
JS 事件机制完整示例分析
2020/01/15 Javascript
JS+CSS实现动态时钟
2021/02/19 Javascript
python持久性管理pickle模块详细介绍
2015/02/18 Python
详解设计模式中的工厂方法模式在Python程序中的运用
2016/03/02 Python
python模块简介之有序字典(OrderedDict)
2016/12/01 Python
Pycharm代码无法复制,无法选中删除,无法编辑的解决方法
2018/10/22 Python
Python操作json的方法实例分析
2018/12/06 Python
keras之权重初始化方式
2020/05/21 Python
详解HTML5中的拖放事件(Drag 和 drop)
2016/11/14 HTML / CSS
西班牙香水和化妆品购物网站:Arenal Perfumerías
2019/03/01 全球购物
自我评价个人范文
2013/12/16 职场文书
我的网上商城创业计划书
2013/12/26 职场文书
《童年》教学反思
2014/02/18 职场文书
幼儿园六一儿童节主持节目串词
2014/03/21 职场文书
学校爱心捐款倡议书
2014/05/13 职场文书
欢迎领导检查标语
2014/06/27 职场文书
TypeScript 内置高级类型编程示例
2022/09/23 Javascript