详解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 相关文章推荐
很可爱的输入框
Aug 03 Javascript
jQuery 获取/设置/删除DOM元素的属性以a元素为例
May 23 Javascript
浅谈jquery.fn.extend与jquery.extend区别
Jul 13 Javascript
Bootstrap组合上、下拉框简单实现代码
Mar 06 Javascript
JavaScript实现三级联动菜单效果
Aug 16 Javascript
微信小程序引用公共js里的方法的实例详解
Aug 17 Javascript
详细分析单线程JS执行问题
Nov 22 Javascript
Vue单页面应用保证F5强刷不清空数据的解决方案
Jan 31 Javascript
Vue服务端渲染实践之Web应用首屏耗时最优化方案
Mar 22 Javascript
js利用递归与promise 按顺序请求数据的方法
Aug 30 Javascript
js判断复选框是否选中的方法示例【基于jQuery】
Oct 10 jQuery
vue实现带过渡效果的下拉菜单功能
Feb 19 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默认安装产生系统漏洞
2006/10/09 PHP
PHP学习之输出字符串(echo,print,printf,print_r和var_dump)
2011/04/17 PHP
Yii实现多按钮保存与提交的方法
2014/12/03 PHP
一张表搞清楚php is_null、empty、isset的区别
2015/07/07 PHP
php使用ZipArchive函数实现文件的压缩与解压缩
2015/10/27 PHP
关于php开启错误提示的总结
2019/09/24 PHP
javascript中IE浏览器不支持NEW DATE()带参数的解决方法
2012/03/01 Javascript
关于js new Date() 出现NaN 的分析
2012/10/23 Javascript
用jquery模仿的a的title属性(兼容ie6/7)
2013/01/21 Javascript
学习JavaScript设计模式(策略模式)
2015/11/26 Javascript
浅析BootStrap Treeview的简单使用
2016/10/12 Javascript
原生JS获取元素集合的子元素宽度实例
2016/12/14 Javascript
js实现会跳动的日历效果(完整实例)
2017/10/18 Javascript
js实现图片粘贴上传到服务器并展示的实例
2017/11/08 Javascript
详解 vue better-scroll滚动插件排坑
2018/02/08 Javascript
JS实现模糊查询带下拉匹配效果
2018/06/21 Javascript
微信小程序引用iconfont图标的方法
2018/10/22 Javascript
Vue项目部署在Spring Boot出现页面空白问题的解决方案
2018/11/26 Javascript
vue-cli 目录结构详细讲解总结
2019/01/15 Javascript
vue自定义指令之面板拖拽的实现
2019/04/14 Javascript
详解Vue中组件传值的多重实现方式
2019/08/16 Javascript
JavaScript实现HSL拾色器
2020/05/21 Javascript
解决vue中axios设置超时(超过5分钟)没反应的问题
2020/09/04 Javascript
在IIS服务器上以CGI方式运行Python脚本的教程
2015/04/25 Python
Python实现的彩票机选器实例
2015/06/17 Python
Windows上使用virtualenv搭建Python+Flask开发环境
2016/06/07 Python
python twilio模块实现发送手机短信功能
2019/08/02 Python
python3 pillow模块实现简单验证码
2019/10/31 Python
利用Python将图片中扭曲矩形的复原
2020/09/07 Python
记录一下scrapy中settings的一些配置小结
2020/09/28 Python
使用Python实现音频双通道分离
2020/12/25 Python
CSS3实现大小不一的粒子旋转加载动画
2016/04/21 HTML / CSS
学院书画协会部门岗位职责
2013/12/01 职场文书
销售人员获奖感言
2014/02/05 职场文书
洗发露广告词
2014/03/14 职场文书
利用Nginx代理如何解决前端跨域问题详析
2021/04/02 Servers