详解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 相关文章推荐
ANGULARJS中用NG-BIND指令实现单向绑定的例子
Dec 08 Javascript
Javascript核心读书有感之语句
Feb 11 Javascript
理解javascript中的严格模式
Feb 01 Javascript
Javascript 字符串模板的简单实现
Feb 13 Javascript
JavaScript 深层克隆对象详解及实例
Nov 03 Javascript
值得分享的JavaScript实现图片轮播组件
Nov 21 Javascript
JavaScript获取键盘按键的键码(参照表)
Jan 10 Javascript
原生js封装添加class,删除class的实例
Nov 06 Javascript
JS函数节流和函数防抖问题分析
Dec 18 Javascript
jQuery实现ajax的嵌套请求案例分析
Feb 16 jQuery
KnockoutJS数组比较算法实例详解
Nov 25 Javascript
react使用CSS实现react动画功能示例
May 18 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实现上传图片到 zimg 服务器
2016/10/19 PHP
PHP自定义序列化接口Serializable用法分析
2017/12/29 PHP
php判断IP地址是否在多个IP段内
2020/08/18 PHP
jq实现酷炫的鼠标经过图片翻滚效果
2014/03/12 Javascript
Jquery使用val方法读写value值
2015/05/18 Javascript
JavaScript程序设计之JS调试
2015/12/09 Javascript
理解javascript对象继承
2016/04/17 Javascript
原生JS实现风箱式demo,并封装了一个运动框架(实例代码)
2016/07/22 Javascript
微信小程序 this和that详解及简单实例
2017/02/13 Javascript
详解从angular-cli:1.0.0-beta.28.3升级到@angular/cli:1.0.0
2017/05/22 Javascript
axios全局请求参数设置,请求及返回拦截器的方法
2018/03/05 Javascript
vue异步加载高德地图的实现
2018/06/19 Javascript
LayUI表格批量删除方法
2018/08/15 Javascript
.netcore+vue 实现压缩文件下载功能
2020/09/24 Javascript
微信小程序调用后台service教程详解
2020/11/06 Javascript
[04:40]2016国际邀请赛中国区预选赛全程TOP10镜头集锦
2016/07/01 DOTA
[47:52]DOTA2-DPC中国联赛正赛 iG vs LBZS BO3 第二场 3月4日
2021/03/11 DOTA
对于Python装饰器使用的一些建议
2015/06/03 Python
Python去除字符串前后空格的几种方法
2019/03/04 Python
python的sorted用法详解
2019/06/25 Python
Django项目创建到启动详解(最全最详细)
2019/09/07 Python
基于Tensorflow一维卷积用法详解
2020/05/22 Python
使用Keras训练好的.h5模型来测试一个实例
2020/07/06 Python
解决Python中导入自己写的类,被划红线,但不影响执行的问题
2020/07/13 Python
Selenium及python实现滚动操作多种方法
2020/07/21 Python
Python制作简单的剪刀石头布游戏
2020/12/10 Python
基于html5 DeviceOrientation 实现微信摇一摇功能
2015/09/25 HTML / CSS
基于Html5实现的语音搜索功能
2019/05/13 HTML / CSS
世界上最大的家庭自动化公司:Smarthome
2017/12/20 全球购物
医学生个人求职信范文
2014/02/07 职场文书
《油菜花开了》教学反思
2014/02/22 职场文书
信息与计算科学专业推荐信
2014/02/23 职场文书
中专生自荐信
2014/06/25 职场文书
幼儿生日活动方案
2014/08/27 职场文书
个人遵守党的政治纪律情况对照检查材料
2014/09/26 职场文书
故宫英文导游词
2015/01/31 职场文书