详解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 相关文章推荐
JS backgroundImage控制
May 19 Javascript
javascript 用函数语句和表达式定义函数的区别详解
Jan 06 Javascript
jQuery大于号(&gt;)选择器的作用解释
Jan 13 Javascript
jQuery实现的在线答题功能
Apr 12 Javascript
Node.js插件安装图文教程
May 06 Javascript
DWR3 访问WEB元素的两种方法实例详解
Jan 03 Javascript
javascript正则表达式模糊匹配IP地址功能示例
Jan 06 Javascript
基于jQuery实现照片墙自动播放特效
Jan 12 Javascript
vue elementUI使用tabs与导航栏联动
Jun 21 Javascript
js与jquery获取input输入框中的值实例讲解
Feb 27 jQuery
Kettle中使用JavaScrip调用jar包对文件内容进行MD5加密的操作方法
Sep 04 Javascript
vue配置多代理服务接口地址操作
Sep 08 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
动漫定律:眯眯眼都是怪物!这些角色狠话不多~
2020/03/03 日漫
浅析PHP微信支付通知的处理方式
2014/05/25 PHP
PHP安全下载文件的方法
2016/04/07 PHP
基于jquery的滚动新闻列表
2010/06/19 Javascript
date.parse在IE和FF中的区别
2010/07/29 Javascript
前台js改变Session的值(用ajax实现)
2012/12/28 Javascript
jquery复选框checkbox实现删除前判断
2014/04/20 Javascript
Node.js中HTTP模块与事件模块详解
2014/11/14 Javascript
学习Bootstrap组件之下拉菜单
2015/07/28 Javascript
JavaScript实现拖拽元素对齐到网格(每次移动固定距离)
2016/11/30 Javascript
详解如何让InstantClick兼容MathJax、百度统计等
2017/09/12 Javascript
vue2.0 自定义组件的方法(vue组件的封装)
2018/06/05 Javascript
React生命周期原理与用法踩坑笔记
2020/04/28 Javascript
JS pushlet XMLAdapter适配器用法案例解析
2020/10/16 Javascript
在VUE中使用lodash的debounce和throttle操作
2020/11/09 Javascript
vue watch监控对象的简单方法示例
2021/01/07 Vue.js
JavaScript实现筛选数组
2021/03/02 Javascript
详解Python中的装饰器、闭包和functools的教程
2015/04/02 Python
python xml.etree.ElementTree遍历xml所有节点实例详解
2016/12/04 Python
Python操作MySQL数据库的三种方法总结
2018/01/30 Python
python自动化报告的输出用例详解
2018/05/30 Python
pycharm的console输入实现换行的方法
2019/01/16 Python
Python任意字符串转16, 32, 64进制的方法
2019/06/12 Python
Python matplotlib画曲线例题解析
2020/02/07 Python
html5 canvas绘制放射性渐变色效果
2018/01/04 HTML / CSS
土耳其国际性时尚购物网站:Modanisa
2018/01/19 全球购物
汽车运用工程系毕业生自荐信
2013/12/27 职场文书
数控技术应用个人求职信范文
2014/02/03 职场文书
机械设计及其自动化求职推荐信
2014/02/17 职场文书
行政管理毕业生自荐信
2014/02/24 职场文书
教师四风问题整改措施
2014/09/25 职场文书
联谊活动总结范文
2015/05/09 职场文书
音乐之声观后感
2015/06/04 职场文书
校园之声广播稿
2015/08/18 职场文书
Python面向对象之内置函数相关知识总结
2021/06/24 Python
nginx lua 操作 mysql
2022/05/15 Servers