详细解密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 load方法用法集锦
Dec 06 Javascript
javascript常见操作汇总
Sep 03 Javascript
JS实现网站菜单拖拽移位效果的方法
Sep 24 Javascript
jquery实现倒计时功能
Dec 28 Javascript
ionic环境配置及问题详解
Jun 27 Javascript
Angular4如何自定义首屏的加载动画详解
Jul 26 Javascript
浅谈vue,angular,react数据双向绑定原理分析
Nov 28 Javascript
JS交互点击WKWebView中的图片实现预览效果
Jan 05 Javascript
layui+SSM的数据表的增删改实例(利用弹框添加、修改)
Sep 27 Javascript
javascript浅层克隆、深度克隆对比及实例解析
Feb 09 Javascript
vue-cli4项目开启eslint保存时自动格式问题
Jul 13 Javascript
JavaScript的一些小技巧分享
Jan 06 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排序算法(冒泡排序,快速排序)
2012/10/09 PHP
php使用fgetcsv读取csv文件出现乱码的解决方法
2014/11/08 PHP
jquery入门—访问DOM对象方法
2013/01/07 Javascript
js定时器怎么写?就是在特定时间执行某段程序
2013/10/11 Javascript
javascript查找字符串中出现最多的字符和次数的小例子
2013/10/29 Javascript
如何编写高质量JS代码(续)
2015/02/25 Javascript
javascript实现自动填写表单实例简析
2015/12/02 Javascript
基于jquery实现的仿优酷图片轮播特效代码
2016/01/13 Javascript
jQuery获取某天的农历日期并判断是否除夕或新年的方法
2016/03/01 Javascript
JavaScript原生数组Array常用方法
2017/04/06 Javascript
详解如何将angular-ui的图片轮播组件封装成一个指令
2017/05/09 Javascript
微信小程序使用request网络请求操作实例
2017/12/15 Javascript
Vue官网todoMVC示例代码
2018/01/29 Javascript
vue2.0路由切换后页面滚动位置不变BUG的解决方法
2018/03/14 Javascript
JS事件流与事件处理程序实例分析
2019/08/16 Javascript
Python实现批量下载文件
2015/05/17 Python
Python统计文件中去重后uuid个数的方法
2015/07/30 Python
轻松掌握python设计模式之策略模式
2016/11/18 Python
使用Python &amp; Flask 实现RESTful Web API的实例
2017/09/19 Python
Ubuntu16.04/树莓派Python3+opencv配置教程(分享)
2018/04/02 Python
python批量修改文件编码格式的方法
2018/05/31 Python
PyTorch读取Cifar数据集并显示图片的实例讲解
2018/07/27 Python
django项目环境搭建及在虚拟机本地创建django项目的教程
2019/08/02 Python
Python利用requests模块下载图片实例代码
2019/08/12 Python
python创建学生管理系统
2019/11/22 Python
Python tkinter模版代码实例
2020/02/05 Python
Python3 shutil(高级文件操作模块)实例用法总结
2020/02/19 Python
html5 canvas fillRect坐标和大小的问题解决方法
2014/03/26 HTML / CSS
美国著名童装品牌:OshKosh B’gosh
2016/08/05 全球购物
英国家电直销:Appliances Direct
2016/09/22 全球购物
AHAVA美国官方网站:死海海泥护肤品牌
2016/10/18 全球购物
Tenstickers法国:墙贴和装饰贴纸
2019/08/26 全球购物
毕业生自我鉴定实例
2014/01/21 职场文书
四风专项整治工作情况汇报
2014/10/28 职场文书
学校党支部承诺书
2015/04/30 职场文书
2016年大学生党员公开承诺书
2016/03/24 职场文书