详细解密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 相关文章推荐
Javascript客户端脚本的设计和应用
Aug 21 Javascript
网络之美 JavaScript中Get和Set访问器的实现代码
Sep 19 Javascript
JS获取月的最后一天与JS得到一个月份最大天数的实例代码
Dec 16 Javascript
jQuery实现获取绑定自定义事件元素的方法
Dec 02 Javascript
理解javascript定时器中的setTimeout与setInterval
Feb 23 Javascript
Vue.js 递归组件实现树形菜单(实例分享)
Dec 21 Javascript
node.js+captchapng+jsonwebtoken实现登录验证示例
Aug 17 Javascript
利用Javascript获取选择文本所在的句子详解
Dec 03 Javascript
clipboard.js在移动端复制失败的解决方法
Jun 13 Javascript
微信小程序利用swiper+css实现购物车商品删除功能
Mar 06 Javascript
详解VSCode配置启动Vue项目
May 14 Javascript
JS跨浏览器解析XML应用过程详解
Oct 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
php采用curl访问域名返回405 method not allowed提示的解决方法
2014/06/26 PHP
详解PHP对数组的定义以及数组的创建方法
2015/11/27 PHP
关于ThinkPhp 框架表单验证及ajax验证问题
2017/07/19 PHP
JScript分割字符串示例代码
2013/09/04 Javascript
使用js Math.random()函数生成n到m间的随机数字
2014/10/09 Javascript
JS实现向表格行添加新单元格的方法
2015/03/30 Javascript
把Node.js程序加入服务实现随机启动
2015/06/25 Javascript
基于JS代码实现导航条弹出式悬浮菜单
2016/06/17 Javascript
最全的Javascript编码规范(推荐)
2016/06/22 Javascript
jquery轮播的实现方式 附完整实例
2016/07/28 Javascript
AngularJS 在同一个界面启动多个ng-app应用模块详解
2016/12/20 Javascript
JavaScript作用域、闭包、对象与原型链概念及用法实例总结
2018/08/20 Javascript
jquery操作checkbox的常用方法总结【附测试源码下载】
2019/06/10 jQuery
[03:24][TI9纪实] Dota奶爸
2019/08/22 DOTA
Python使用MD5加密字符串示例
2014/08/22 Python
python实现的简单抽奖系统实例
2015/05/22 Python
python实现支付宝当面付(扫码支付)功能
2018/05/30 Python
利用python脚本如何简化jar操作命令
2019/02/24 Python
python实现websocket的客户端压力测试
2019/06/25 Python
基于python的Paxos算法实现
2019/07/03 Python
Python多线程及其基本使用方法实例分析
2019/10/29 Python
Django ForeignKey与数据库的FOREIGN KEY约束详解
2020/05/20 Python
Selenium webdriver添加cookie实现过程详解
2020/08/12 Python
Python unittest如何生成HTMLTestRunner模块
2020/09/08 Python
Omio葡萄牙:全欧洲低价大巴、火车和航班搜索和比价
2019/02/09 全球购物
C#面试问题
2016/07/29 面试题
2014年学习全国道德模范事迹思想汇报
2014/09/15 职场文书
优秀共产党员推荐材料
2014/12/18 职场文书
2015年高一班主任工作总结
2015/05/13 职场文书
主题班会开场白
2015/06/01 职场文书
毕业感言怎么写
2015/07/31 职场文书
Java 将PPT幻灯片转为HTML文件的实现思路
2021/06/11 Java/Android
Pyqt5将多个类组合在一个界面显示的完整示例
2021/09/04 Python
Python办公自动化解决world文件批量转换
2021/09/15 Python
Python函数对象与闭包函数
2022/04/13 Python
Golang 链表的学习和使用
2022/04/19 Golang