详细解密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实现的listview效果
Apr 28 Javascript
js中将多个语句写成一个语句的两种方法小结
Dec 08 Javascript
javascript中错误使用var造成undefined
Mar 31 Javascript
轻松掌握jQuery中wrap()与unwrap()函数的用法
May 24 Javascript
Angular页面间切换及传值的4种方法
Nov 04 Javascript
vuejs2.0子组件改变父组件的数据实例
May 10 Javascript
AngularJS实现的简单拖拽功能示例
Jan 02 Javascript
vue项目tween方法实现返回顶部的示例代码
Mar 02 Javascript
React之PureComponent的使用作用
Jul 10 Javascript
angular 实时监听input框value值的变化触发函数方法
Aug 31 Javascript
微信JS-SDK实现微信会员卡功能(给用户微信卡包里发送会员卡)
Jul 25 Javascript
Vue Element-ui表单校验规则实现
Jul 09 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
一步一步学习PHP(6) 面向对象
2010/02/16 PHP
使用PHP编写发红包程序
2015/07/22 PHP
Laravel程序架构设计思路之使用动作类
2018/06/07 PHP
javascript实现unicode和字符的互相转换
2007/07/18 Javascript
jQuery中add实现同时选择两个id对象
2010/10/22 Javascript
关于JS字符串函数String.replace()
2013/04/07 Javascript
深入理解javascript原型链和继承
2014/09/23 Javascript
JS逆序遍历实现代码
2014/12/02 Javascript
JavaScript设计模式经典之命令模式
2016/02/24 Javascript
利用vue写todolist单页应用
2016/12/15 Javascript
javascript实现圣旨卷轴展开效果(代码分享)
2017/03/23 Javascript
javascript兼容性(实例讲解)
2017/08/15 Javascript
使用JS组件实现带ToolTip验证框的实例代码
2017/08/23 Javascript
bootstrap-table实现服务器分页的示例 (spring 后台)
2017/09/01 Javascript
详解如何实现Element树形控件Tree在懒加载模式下的动态更新
2019/04/25 Javascript
移动端吸顶fixbar的解决方案详解
2019/07/17 Javascript
一文读懂vue动态属性数据绑定(v-bind指令)
2020/07/20 Javascript
如何通过vscode运行调试javascript代码
2020/07/24 Javascript
jquery实现异步文件上传ajaxfileupload.js
2020/10/23 jQuery
[08:53]DOTA2每周TOP10 精彩击杀集锦vol.9
2014/06/26 DOTA
python简单程序读取串口信息的方法
2015/03/13 Python
Python socket网络编程TCP/IP服务器与客户端通信
2017/01/05 Python
python django使用haystack:全文检索的框架(实例讲解)
2017/09/27 Python
Python configparser模块常用方法解析
2020/05/22 Python
Python可视化工具如何实现动态图表
2020/10/23 Python
HTML5 对各个标签的定义与规定:body的介绍
2012/06/21 HTML / CSS
canvas绘制树形结构可视图形的实现
2020/04/03 HTML / CSS
新员工欢迎词
2014/01/12 职场文书
会计辞职信范文
2014/01/15 职场文书
楼面部长岗位职责范本
2014/02/14 职场文书
大学生活自我评价
2014/04/09 职场文书
企业三严三实学习心得体会
2014/10/13 职场文书
工商局所长四风自我剖析及整改措施
2014/10/26 职场文书
优秀党务工作者先进事迹材料
2014/12/25 职场文书
答谢酒会主持词
2015/07/02 职场文书
Redis sentinel哨兵集群的实现步骤
2022/07/15 Redis