详细解密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 EasyUI 中文API Button使用实例
Apr 14 Javascript
Javascript 鼠标移动上去小三角形滑块缓慢跟随效果
Apr 26 Javascript
div+css+js实现无缝滚动类似marquee无缝滚动兼容firefox
Aug 29 Javascript
JavaScript打印网页指定区域的例子
May 03 Javascript
Node.js中安全调用系统命令的方法(避免注入安全漏洞)
Dec 05 Javascript
JS+CSS实现Div弹出窗口同时背景变暗的方法
Mar 04 Javascript
模仿password输入框的实现代码
Jun 07 Javascript
Angular2.0/4.0 使用Echarts图表的示例代码
Dec 07 Javascript
js中int和string数据类型互相转化实例
Jan 16 Javascript
京东优选小程序的实现代码示例
Feb 25 Javascript
Vant picker 多级联动操作
Nov 02 Javascript
详解Vue router路由
Nov 20 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入门
2006/10/09 PHP
php include的妙用,实现路径加密
2008/07/29 PHP
PHP中spl_autoload_register()和__autoload()区别分析
2014/05/10 PHP
php中字符集转换iconv函数使用总结
2014/10/11 PHP
PHP中JSON的应用技巧
2015/10/10 PHP
laravel5创建service provider和facade的方法详解
2016/07/26 PHP
浅谈thinkphp的nginx配置,以及重写隐藏index.php入口文件方法
2019/10/12 PHP
JS中剪贴板兼容性、判断复制成功或失败
2021/03/09 Javascript
让ie6也支持websocket采用flash封装实现
2013/02/18 Javascript
浅析JQuery UI Dialog的样式设置问题
2013/12/18 Javascript
javascript生成随机大小写字母的方法
2014/02/20 Javascript
基于jQuery实现网页进度显示插件
2015/03/04 Javascript
JavaScript操作class和style样式代码详解
2016/02/13 Javascript
JS中split()用法(将字符串按指定符号分割成数组)
2016/10/24 Javascript
Vue.JS入门教程之自定义指令
2016/12/08 Javascript
微信小程序 安全包括(框架、功能模块、账户使用)详解
2017/01/16 Javascript
Js利用prototype自定义数组方法示例
2017/10/20 Javascript
详解使用mpvue开发github小程序总结
2018/07/25 Javascript
vue实现直播间点赞飘心效果的示例代码
2019/09/20 Javascript
浅谈layui分页控件field参数接收对象的问题
2019/09/20 Javascript
Openlayers学习之地图比例尺控件
2020/09/28 Javascript
用js实现放大镜效果
2020/10/28 Javascript
[02:32]DOTA2完美大师赛场馆静安体育中心观赛全攻略
2017/11/08 DOTA
简单讲解Python中的闭包
2015/08/11 Python
详解python websocket获取实时数据的几种常见链接方式
2019/07/01 Python
使用python实现微信小程序自动签到功能
2020/04/27 Python
python openCV实现摄像头获取人脸图片
2020/08/20 Python
Django创建一个后台的基本步骤记录
2020/10/02 Python
Jmeter调用Python脚本实现参数互相传递的实现
2021/01/22 Python
全球酒店预订网站:Hotels.com
2016/08/10 全球购物
Perfume’s Club法国站:购买香水和化妆品
2019/05/02 全球购物
家教广告词
2014/03/19 职场文书
销售经理工作检讨书
2015/02/19 职场文书
本科毕业论文致谢怎么写
2015/05/14 职场文书
幼儿园班级工作总结2015
2015/05/25 职场文书
Java练习之潜艇小游戏的实现
2022/03/16 Java/Android