详细解密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 相关文章推荐
js 第二代身份证号码的验证机制代码
May 12 Javascript
JS实现队列与堆栈的方法
Apr 21 Javascript
原生js获取iframe中dom元素--父子页面相互获取对方dom元素的方法
Aug 05 Javascript
深入理解javascript的getTime()方法
Feb 16 Javascript
angular中的http拦截器Interceptors的实现
Feb 21 Javascript
详解如何使用vue-cli脚手架搭建Vue.js项目
May 19 Javascript
AngularJS 中的数据源的循环输出
Oct 12 Javascript
基于Vue2x的图片预览插件的示例代码
May 14 Javascript
vue项目中使用百度地图的方法
Jun 08 Javascript
使用vue-infinite-scroll实现无限滚动效果
Jun 22 Javascript
微信小程序自定义modal弹窗组件的方法详解
Dec 20 Javascript
Vue多选列表组件深入详解
Mar 02 Vue.js
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
全文搜索和替换
2006/10/09 PHP
php setcookie(name, value, expires, path, domain, secure) 参数详解
2013/06/28 PHP
php+mysql实现的二级联动菜单效果详解
2016/05/10 PHP
windows下的WAMP环境搭建图文教程(推荐)
2017/07/27 PHP
ThinkPHP5分页paginate代码实例解析
2020/11/10 PHP
JS启动应用程序的一个简单例子
2008/05/11 Javascript
使用jQuery全局事件ajaxStart为特定请求实现提示效果的代码
2010/12/30 Javascript
javascript针对DOM的应用分析(三)
2012/04/15 Javascript
JavaScript获取鼠标移动时的坐标(兼容IE8、chome谷歌、Firefox)
2014/09/13 Javascript
javascript实现网页中涉及的简易运动(改变宽高、透明度、位置)
2015/11/29 Javascript
js仿微博动态栏功能
2017/02/22 Javascript
js 倒计时(高效率服务器时间同步)
2017/09/12 Javascript
Vuex 模块化使用详解
2019/07/31 Javascript
Vue 动态路由的实现及 Springsecurity 按钮级别的权限控制
2019/09/05 Javascript
vue自定义标签和单页面多路由的实现代码
2020/05/03 Javascript
vue 限制input只能输入正数的操作
2020/08/05 Javascript
JavaScript async/await原理及实例解析
2020/12/02 Javascript
asyncio 的 coroutine对象 与 Future对象使用指南
2016/09/11 Python
Python实现按学生年龄排序的实际问题详解
2017/08/29 Python
java中两个byte数组实现合并的示例
2018/05/09 Python
pycharm在调试python时执行其他语句的方法
2018/11/29 Python
Python OpenCV实现鼠标画框效果
2020/08/19 Python
在pycharm中配置Anaconda以及pip源配置详解
2019/09/09 Python
使用python实现回文数的四种方法小结
2019/11/24 Python
Python select及selectors模块概念用法详解
2020/06/22 Python
教你一分钟在win10终端成功安装Pytorch的方法步骤
2021/01/28 Python
Easy Spirit官网:美国休闲鞋履中的代表品牌
2019/04/12 全球购物
新郎父亲婚宴答谢词
2014/01/11 职场文书
药品促销活动方案
2014/02/14 职场文书
小学阳光体育活动总结
2014/07/05 职场文书
2014年网管工作总结
2014/12/11 职场文书
劳动保障个人工作总结
2015/03/04 职场文书
调任通知
2015/04/21 职场文书
银行文明优质服务培训心得体会
2016/01/09 职场文书
《作风建设永远在路上》心得体会
2016/01/21 职场文书
SQL基础的查询语句
2021/11/11 MySQL