详解js跨域原理以及2种解决方案


Posted in Javascript onDecember 09, 2015

1.什么是跨域

我们经常会在页面上使用ajax请求访问其他服务器的数据,此时,客户端会出现跨域问题.

跨域问题是由于javascript语言安全限制中的同源策略造成的.

简单来说,同源策略是指一段脚本只能读取来自同一来源的窗口和文档的属性,这里的同一来源指的是主机名、协议和端口号的组合.

例如:

详解js跨域原理以及2种解决方案

2.实现原理

在HTML DOM中,Script标签是可以跨域访问服务器上的数据的.因此,可以指定script的src属性为跨域的url,从而实现跨域访问.

例如:

这种访问方式是不行的.但是如下方式,却是可以的.

这里对返回的数据有个要求,即:服务器返回的数据不能是单纯的如{“Name”:”zhangsan”}

如果返回的是这个json字符串,我们是没有办法引用这个字符串的.所以,要求返回的值,务必是var json={“Name”:”zhangsan”},或json({“Name”:”zhangsan”})

为了使程序不报错,我们务必还要建立个json函数.

3.解决方案

方案一
服务器端:

protected void Page_Load(object sender, EventArgs e)
  {
    string result = "callback({\"name\":\"zhangsan\",\"date\":\"2012-12-03\"})";

    Response.Clear();
    Response.Write(result);
    Response.End();
  }

客户端:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
  <title></title>
  <script type="text/javascript">

    var result = null;
    window.onload = function () {
      var script = document.createElement("script");
      script.type = "text/javascript";
      script.src = "http://192.168.0.101/ExampleBusinessApplication.Web/web2.aspx";

      var head = document.getElementsByTagName("head")[0];
      head.insertBefore(script, head.firstChild);

    };

    function callback(data) {
      result = data;
    }

    function b_click() {
      alert(result.name);
    }
  </script>
</head>
<body>
  <input type="button" value="click me!" onclick="b_click();" />
</body>
</html>

方案二:通过jquery来完成

通过jquery的jsonp的方式.使用此方式,对服务器端有要求.

服务器端如下:

protected void Page_Load(object sender, EventArgs e)
  {
    string callback = Request.QueryString["jsoncallback"];

    string result = callback + "({\"name\":\"zhangsan\",\"date\":\"2012-12-03\"})";

    Response.Clear();
    Response.Write(result);
    Response.End();
  }

客户端:

$.ajax({ 
        async: false, 
        url: "http://192.168.0.5/Web/web1.aspx", 
        type: "GET", 
        dataType: 'jsonp', 
        //jsonp的值自定义,如果使用jsoncallback,那么服务器端,要返回一个jsoncallback的值对应的对象. 
        jsonp: 'jsoncallback', 
        //要传递的参数,没有传参时,也一定要写上 
         data: null, 
        timeout: 5000, 
        //返回Json类型 
         contentType: "application/json;utf-8", 
        //服务器段返回的对象包含name,data属性. 
        success: function (result) { 
          alert(result.date); 
        }, 
        error: function (jqXHR, textStatus, errorThrown) { 
          alert(textStatus); 
        } 
      });

实际上,在我们执行这段js时,js向服务器发出了这样一个请求:

http://192.168.0.5/Web/web1.aspx?jsoncallback=jsonp1354505244726&_=1354505244742

而服务器也相应的返回了如下对象:

jsonp1354506338864({"name":"zhangsan","date":"2012-12-03"})

此时就实现了跨域范文数据的要求.

以上就是关于js跨域原理以及2种解决方案介绍,希望对大家学习跨域知识点有所帮助,大家也可以结合其他相关文章进行学习研究。

Javascript 相关文章推荐
fix-ie5.js扩展在IE5下不能使用的几个方法
Aug 20 Javascript
轻量级 JS ToolTip提示效果
Jul 20 Javascript
uploadify 3.0 详细使用说明
Jun 18 Javascript
javascript使用中为什么10..toString()正常而10.toString()出错呢
Jan 11 Javascript
JS 实现导航栏悬停效果(续2)
Sep 24 Javascript
基于jquery的手风琴图片展示效果实现方法
Dec 16 Javascript
jQuery检测输入的字符串包含的中英文的数量
Apr 17 Javascript
javascript中indexOf技术详解
May 07 Javascript
jQuery实现鼠标滚动图片延迟加载效果附源码下载
Jun 28 Javascript
JQuery手速测试小游戏实现思路详解
Sep 20 Javascript
使用vue根据状态添加列表数据和删除列表数据的实例
Sep 29 Javascript
原生JS封装拖动验证滑块的实现代码示例
Jun 01 Javascript
深入探讨前端框架react
Dec 09 #Javascript
JavaScript中rem布局在react中的应用
Dec 09 #Javascript
js获取鼠标位置实例详解
Dec 09 #Javascript
JavaScript常用基础知识强化学习
Dec 09 #Javascript
AngularJS实现元素显示和隐藏的几个案例
Dec 09 #Javascript
谈谈AngularJs中的隐藏和显示
Dec 09 #Javascript
jquery插件ajaxupload实现文件上传操作
Dec 09 #Javascript
You might like
攻克CakePHP系列一 连接MySQL数据库
2008/10/22 PHP
摘自织梦CMS的HTTP文件下载类
2015/08/08 PHP
php闭包中使用use声明变量的作用域实例分析
2018/08/09 PHP
php上传图片并给图片打上透明水印的代码
2010/06/07 Javascript
多个js与css文件的合并方法详细说明
2012/12/26 Javascript
Js操作Select大全(取值、设置选中等等)
2013/10/29 Javascript
JavaScript对象之深度克隆介绍
2014/12/08 Javascript
使用jQuery实现图片遮罩半透明坠落遮挡
2015/03/16 Javascript
javascript中的后退和刷新实现方法
2016/11/10 Javascript
如何在Angular2中使用jQuery及其插件的方法
2017/02/09 Javascript
angular.js指令中transclude选项及ng-transclude指令详解
2017/05/24 Javascript
vue.js的手脚架vue-cli项目搭建的步骤
2017/08/30 Javascript
nodejs使用redis作为缓存介质实现的封装缓存类示例
2018/02/07 NodeJs
详解vue的diff算法原理
2018/05/20 Javascript
vue中引用swiper轮播插件的教程详解
2018/08/16 Javascript
js实现文件上传功能 后台使用MultipartFile
2018/09/08 Javascript
详解Vue Elementui中的Tag与页面其它元素相互交互的两三事
2018/09/25 Javascript
jquery 验证用户名是否重复代码实例
2019/05/14 jQuery
javascript面向对象创建对象的方式小结
2019/07/29 Javascript
vue 动态表单开发方法案例详解
2019/12/02 Javascript
在微信小程序中渲染HTML内容3种解决方案及分析与问题解决
2020/01/12 Javascript
Python3.x和Python2.x的区别介绍
2013/02/12 Python
python操作MySQL数据库具体方法
2013/10/28 Python
Numpy数组的保存与读取方法
2018/04/04 Python
python检测文件夹变化,并拷贝有更新的文件到对应目录的方法
2018/10/17 Python
Pytorch之卷积层的使用详解
2019/12/31 Python
Tensorflow实现部分参数梯度更新操作
2020/01/23 Python
pandas读取csv文件提示不存在的解决方法及原因分析
2020/04/21 Python
国际礼品店:GiftsnIdeas
2018/05/03 全球购物
南非最大的在线时尚商店:Zando
2019/07/21 全球购物
教师自我鉴定
2013/12/13 职场文书
入党自我评价优缺点
2014/01/25 职场文书
提拔干部考察材料
2014/05/26 职场文书
预防传染病方案
2014/06/14 职场文书
暑期培训班招生方案
2014/08/26 职场文书
分析JVM源码之Thread.interrupt系统级别线程打断
2021/06/29 Java/Android