详细解密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 通过事件委派一次绑定多种事件,以减少事件冗余
Jun 30 Javascript
js日期相关函数总结分享
Oct 15 Javascript
Firefox中使用outerHTML的2种解决方法
Jun 07 Javascript
深入浅析JavaScript中对事件的三种监听方式
Sep 29 Javascript
jQuery File Upload文件上传插件使用详解
Dec 06 Javascript
JSON与JS对象的区别与对比
Mar 01 Javascript
js学使用setTimeout实现轮循动画
Jul 17 Javascript
vue基于mint-ui的城市选择3级联动的示例
Oct 25 Javascript
js的继承方法小结(prototype、call、apply)(推荐)
Apr 17 Javascript
vue+element实现表单校验功能
May 20 Javascript
基于JS实现一个随机生成验证码功能
May 29 Javascript
开发一个封装iframe的vue组件
Mar 29 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 JSON 数据解析代码
2010/05/26 PHP
ThinkPHP采用原生query实现关联查询left join实例
2014/12/02 PHP
javascript textContent与innerText的异同分析
2010/10/22 Javascript
基于jquery的一个OutlookBar类,动态创建导航条
2010/11/19 Javascript
php与js的区别是什么
2013/08/05 Javascript
基于jquery实现一张图片点击鼠标放大再点缩小
2013/09/29 Javascript
在浏览器中打开或关闭JavaScript的方法
2015/06/03 Javascript
浅谈Javascript数组索引
2015/07/29 Javascript
详解JavaScript实现设计模式中的适配器模式的方法
2016/05/18 Javascript
jQuery复制节点用法示例(clone方法)
2016/09/08 Javascript
bootstrap模态框实现拖拽效果
2016/12/14 Javascript
js遍历json对象所有key及根据动态key获取值的方法(必看)
2017/03/09 Javascript
纯js实现隔行变色效果
2017/11/29 Javascript
前端Vue项目详解--初始化及导航栏
2019/06/24 Javascript
js变量值传到php过程详解 将php解析成数据
2019/06/26 Javascript
js通过循环多张图片实现动画效果
2019/12/19 Javascript
JavaScript碰撞检测原理及其实现代码
2020/03/12 Javascript
[01:03]PWL开团时刻DAY6——别打我
2020/11/05 DOTA
python33 urllib2使用方法细节讲解
2013/12/03 Python
Python语法快速入门指南
2015/10/12 Python
Python环境下搭建属于自己的pip源的教程
2016/05/05 Python
Python实现的概率分布运算操作示例
2017/08/14 Python
python编程嵌套函数实例代码
2018/02/11 Python
python简单鼠标自动点击某区域的实例
2019/06/25 Python
Django 批量插入数据的实现方法
2020/01/12 Python
完美解决pycharm导入自己写的py文件爆红问题
2020/02/12 Python
解决Python pip 自动更新升级失败的问题
2020/02/21 Python
CSS3,线性渐变(linear-gradient)的使用总结
2017/01/09 HTML / CSS
HTML5中使用json对象的实例代码
2018/09/10 HTML / CSS
寻找完美的房车租赁:RVShare
2019/02/23 全球购物
如何在Cookie里面保存Unicode和国际化字符
2013/05/25 面试题
讲文明树新风公益广告宣传方案
2014/02/25 职场文书
婚庆司仪开场白
2015/05/29 职场文书
婚礼迎宾词大全
2015/08/10 职场文书
Python-typing: 类型标注与支持 Any类型详解
2021/05/10 Python
Java比较两个对象中全部属性值是否相等的方法
2021/08/07 Java/Android