详细解密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 相关文章推荐
JQuery 简便实现页面元素数据验证功能
Mar 24 Javascript
详谈 Jquery Ajax异步处理Json数据.
Sep 09 Javascript
js内存泄露的几种情况详细探讨
May 31 Javascript
js切换光标示例代码
Oct 10 Javascript
jquery五角星评分插件示例分享
Feb 21 Javascript
jQuery学习笔记之 Ajax操作篇(二) - 数据传递
Jun 23 Javascript
JavaScript学习总结之JS、AJAX应用
Jan 29 Javascript
Bootstrap~多级导航(级联导航)的实现效果【附代码】
Mar 08 Javascript
JavaScript制作简易计算器(不用eval)
Feb 05 Javascript
解决JQuery全选/反选第二次失效的问题
Oct 11 jQuery
web前端开发中常见的多列布局解决方案整理(一定要看)
Oct 15 Javascript
详解VueJS应用中管理用户权限
Feb 02 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 cookie 登录验证示例代码
2009/03/16 PHP
php 编写安全的代码时容易犯的错误小结
2010/05/20 PHP
微信公众号开发之微信公共平台消息回复类实例
2014/11/14 PHP
PHP实现支持SSL连接的SMTP邮件发送类
2015/03/05 PHP
PHP在linux上执行外部命令的方法
2017/02/06 PHP
PHP实现数据四舍五入的方法小结【4种方法】
2019/03/27 PHP
根据分辨率不同,调用不同的css文件
2006/07/07 Javascript
Jquery中dialog属性小记
2010/09/03 Javascript
JavaScript代码简单实现求杨辉三角给定行的最大值
2013/10/29 Javascript
jquery动态改变div宽度和高度
2015/02/09 Javascript
使用jQuery监听DOM元素大小变化
2016/02/24 Javascript
Bootstrap每天必学之弹出框(Popover)插件
2016/04/25 Javascript
JavaScript类型系统之布尔Boolean类型详解
2016/06/26 Javascript
Google 地图控件集详解及实例代码
2016/08/06 Javascript
jQuery实现用户输入自动完成功能
2017/02/13 Javascript
laravel5.4+vue+element简单搭建的示例代码
2017/08/29 Javascript
用Fundebug插件记录网络请求异常的方法
2019/02/21 Javascript
小程序云开发教程如何使用云函数实现点赞功能
2019/05/18 Javascript
Vue中对iframe实现keep alive无刷新的方法
2019/07/23 Javascript
微信小程序点击view动态添加样式过程解析
2020/01/21 Javascript
jquery制作的移动端购物车效果完整示例
2020/02/24 jQuery
vue 页面回退mounted函数不执行的解决方案
2020/07/26 Javascript
[02:04]2014DOTA2国际邀请赛 DK一个时代的落幕
2014/07/21 DOTA
[50:04]DOTA2上海特级锦标赛D组小组赛#2 Liquid VS VP第二局
2016/02/28 DOTA
Python字符串中查找子串小技巧
2015/04/10 Python
Python生成随机数组的方法小结
2017/04/15 Python
python存储16bit和32bit图像的实例
2018/12/05 Python
Python内建序列通用操作6种实现方法
2020/03/26 Python
优秀大学生求职自荐信范文
2014/04/19 职场文书
公务员试用期满考核材料
2014/05/22 职场文书
《我爱祖国》演讲稿1000字
2014/09/26 职场文书
铁路安全反思材料
2014/12/24 职场文书
小学教师节活动总结
2015/03/20 职场文书
公司庆典主持词
2015/07/04 职场文书
2016年领导干部正风肃纪心得体会
2015/10/09 职场文书
浅谈Redis的事件驱动模型
2022/05/30 Redis