详解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 相关文章推荐
利用javascript移动div层-javascript 拖动层
Mar 22 Javascript
Javascript模块化编程(一)AMD规范(规范使用模块)
Jan 17 Javascript
jquery增加时编辑jqGrid(实例代码)
Nov 08 Javascript
js校验表单后提交表单的三种方法总结
Feb 28 Javascript
两种不同的方法实现js对checkbox进行全选和反选
May 13 Javascript
javascript实时显示当天日期的方法
May 20 Javascript
详解JavaScript中的事件流和事件处理程序
May 20 Javascript
Webpack如何引入bootstrap的方法
Jun 17 Javascript
使用ng-packagr打包Angular的方法示例
Sep 21 Javascript
详解Vue串联过滤器的使用场景
Apr 30 Javascript
vuex管理状态仓库使用详解
Jul 29 Javascript
JS指定音频audio在某个时间点进行播放
Nov 28 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
PHP将两个关联数组合并函数提高函数效率
2014/03/18 PHP
PHP多线程之内部多线程实例分析
2015/03/09 PHP
PHP输入流php://input实例讲解
2015/12/22 PHP
PHP有序表查找之插值查找算法示例
2018/02/10 PHP
JavaScript 事件的一些重要说明
2009/10/25 Javascript
js获取浏览器的可视区域尺寸的实现代码
2011/11/30 Javascript
JavaScript中变量提升 Hoisting
2012/07/03 Javascript
jquery cookie实现的简单换肤功能适合小网站
2013/08/25 Javascript
javascript模拟实现C# String.format函数功能代码
2013/11/25 Javascript
JavaScript删除数组元素的方法
2015/03/20 Javascript
Javascript代码实现仿实例化类
2015/04/03 Javascript
JS简单实现动画弹出层效果
2015/05/05 Javascript
js实现简单锁屏功能实例
2015/05/27 Javascript
根据user-agent判断蜘蛛代码黑帽跳转代码(js版与php版本)
2015/09/14 Javascript
JavaScript实现简单的拖动效果
2016/07/02 Javascript
D3.js实现文本的换行详解
2016/10/14 Javascript
js 文字超出长度用省略号代替,鼠标悬停并以悬浮框显示实例
2016/12/06 Javascript
Vue.js中数据绑定的语法教程
2017/06/02 Javascript
JavaScript中各数制转换全面总结
2017/08/21 Javascript
Vue脚手架的简单使用实例
2018/07/10 Javascript
React Native开发封装Toast与加载Loading组件示例
2018/09/08 Javascript
angular6 填坑之sdk的方法
2018/12/27 Javascript
[01:53]DOTA2超级联赛专访Zhou 五年职业青春成长
2013/05/29 DOTA
打开电脑上的QQ的python代码
2013/02/10 Python
python和shell实现的校验IP地址合法性脚本分享
2014/10/23 Python
分享6个隐藏的python功能
2017/12/07 Python
Python利用for循环打印星号三角形的案例
2020/04/12 Python
13个Pandas实用技巧,助你提高开发效率
2020/08/19 Python
python 解决Windows平台上路径有空格的问题
2020/11/10 Python
Django用内置方法实现简单搜索功能的方法
2020/12/18 Python
详解如何使用rem或viewport进行移动端适配
2020/08/14 HTML / CSS
Zatchels官网:英国剑桥包品牌
2021/01/12 全球购物
如何强制垃圾回收
2015/10/06 面试题
《秋姑娘的信》教学反思
2014/02/28 职场文书
2014年十一国庆节爱国演讲稿
2014/09/23 职场文书
如何制定一份可行的计划!
2019/06/21 职场文书