详细解密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中获取下个月一号,是星期几
Jun 01 Javascript
通过JS动态创建一个html DOM元素并显示
Oct 15 Javascript
JavaScript中的值类型详细介绍
Dec 29 Javascript
纯JS代码实现隔行变色鼠标移入高亮
Nov 23 Javascript
js将字符串中的每一个单词的首字母变为大写其余均为小写
Jan 05 Javascript
canvas绘制多边形
Feb 24 Javascript
在页面中引入js的两种方法(推荐)
Aug 29 Javascript
vue组件中使用iframe元素的示例代码
Dec 13 Javascript
vuex的使用及持久化state的方式详解
Jan 23 Javascript
详解Vue.js使用Swiper.js在iOS
Sep 10 Javascript
VUE2.0+ElementUI2.0表格el-table循环动态列渲染的写法详解
Nov 30 Javascript
webpack自动打包和热更新的实现方法
Jun 24 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开发大型项目的一点经验
2006/10/09 PHP
php简单的上传类分享
2016/05/15 PHP
6款经典实用的jQuery小插件及源码(对话框/提示工具等等)
2013/02/04 Javascript
sliderToggle在写jquery的计时器setTimeouter中不生效
2014/05/26 Javascript
JS获取单击按钮单元格所在行的信息
2014/06/17 Javascript
Javascript限制网页只能在微信内置浏览器中访问
2014/11/09 Javascript
javascript实现禁止复制网页内容汇总
2015/12/30 Javascript
如何高效率去掉js数组中的重复项
2016/04/12 Javascript
js实现select二级联动下拉菜单
2020/04/17 Javascript
深入理解JavaScript内置函数
2016/06/03 Javascript
微信+angularJS的SPA应用中用router进行页面跳转,jssdk校验失败问题解决
2016/09/09 Javascript
jQuery实现鼠标经过时高亮,同时其他同级元素变暗的效果
2016/09/18 Javascript
Node.js与Sails redis组件的使用教程
2017/02/14 Javascript
JavaScript之Date_动力节点Java学院整理
2017/06/28 Javascript
解读vue生成的文件目录结构及说明
2017/11/27 Javascript
nodejs实现爬取网站图片功能
2017/12/14 NodeJs
vue+elementUI 实现内容区域高度自适应的示例
2020/09/26 Javascript
Python中异常重试的解决方案详解
2017/05/05 Python
Python实现类的创建与使用方法示例
2017/07/25 Python
python matplotlib 在指定的两个点之间连线方法
2018/05/25 Python
Python网页正文转换语音文件的操作方法
2018/12/09 Python
Python 高效编程技巧分享
2020/09/10 Python
详解pycharm自动import所需的库的操作方法
2020/11/30 Python
HTML5学习笔记之html5与传统html区别
2016/01/06 HTML / CSS
使用HTML5 Canvas绘制圆角矩形及相关的一些应用举例
2016/03/22 HTML / CSS
Dogeared官网:在美国手工制作的珠宝
2019/08/24 全球购物
应聘会计求职信
2014/06/11 职场文书
幼儿园植树节活动总结
2014/07/04 职场文书
社会体育专业大学生职业生涯规划书
2014/09/17 职场文书
投标承诺函范文
2015/01/21 职场文书
农业项目合作意向书
2015/05/08 职场文书
《坐井观天》教学反思
2016/02/18 职场文书
2019年房屋委托租赁合同范本(通用版)!
2019/07/17 职场文书
浅谈MySQL 亿级数据分页的优化
2021/06/15 MySQL
vue-cli3.0修改打包后的文件名和文件地址,打包后本地运行报错解决
2022/04/06 Vue.js
Android开发之WECHAT微信小程序路由跳转的两种形式
2022/04/12 Java/Android