当前位置: 首页 > news >正文

js跨域及解决方案

1.什么是跨域

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

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

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

例如:
这里写图片描述

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"})

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

相关文章:

  • Daily Scrumming* 2015.12.13(Day 5)
  • WebApp之JQuery Mobile实现火车列表信息查询
  • 用Unity写一个12306验证器的恶搞图生成软件
  • 高仿微信5.2.1主界面及消息提醒功能
  • 自定义DialogAlert对话框并实现对话框的复用
  • webservice作用(优,缺点;作用)
  • 如何修改Eclipse的背景颜色
  • 编程的智慧
  • 如何修改eclipse快捷键的组合方式
  • 在Application_Error获取Asp.Net未处理异常信息
  • Bmob的使用案例
  • easyui
  • Eclipse导入library的时候报:Found 2 versions of android-support-v4.jar in the dependency list
  • tomcat为什么无法关闭
  • Android项目编译的时候出现:Caused by: java.lang.ClassNotFoundException: com.example.aaa.MainActivity
  • android百种动画侧滑库、步骤视图、TextView效果、社交、搜房、K线图等源码
  • Angular4 模板式表单用法以及验证
  • Cookie 在前端中的实践
  • flask接收请求并推入栈
  • Java 最常见的 200+ 面试题:面试必备
  • JavaScript HTML DOM
  • Markdown 语法简单说明
  • node.js
  • Python学习之路13-记分
  • spring boot下thymeleaf全局静态变量配置
  • underscore源码剖析之整体架构
  • vagrant 添加本地 box 安装 laravel homestead
  • 服务器之间,相同帐号,实现免密钥登录
  • 离散点最小(凸)包围边界查找
  • 前端面试之CSS3新特性
  • 双管齐下,VMware的容器新战略
  • 通信类
  • 中文输入法与React文本输入框的问题与解决方案
  • scrapy中间件源码分析及常用中间件大全
  • 京东物流联手山西图灵打造智能供应链,让阅读更有趣 ...
  • 你学不懂C语言,是因为不懂编写C程序的7个步骤 ...
  • 智能情侣枕Pillow Talk,倾听彼此的心跳
  • ​虚拟化系列介绍(十)
  • (07)Hive——窗口函数详解
  • (1)(1.8) MSP(MultiWii 串行协议)(4.1 版)
  • (14)Hive调优——合并小文件
  • (5)STL算法之复制
  • (WSI分类)WSI分类文献小综述 2024
  • (草履虫都可以看懂的)PyQt子窗口向主窗口传递参数,主窗口接收子窗口信号、参数。
  • (分类)KNN算法- 参数调优
  • (附源码)spring boot儿童教育管理系统 毕业设计 281442
  • (附源码)ssm高校实验室 毕业设计 800008
  • (免费领源码)python#django#mysql公交线路查询系统85021- 计算机毕业设计项目选题推荐
  • (十一)c52学习之旅-动态数码管
  • (已更新)关于Visual Studio 2019安装时VS installer无法下载文件,进度条为0,显示网络有问题的解决办法
  • (转)EXC_BREAKPOINT僵尸错误
  • (转)jdk与jre的区别
  • (转)视频码率,帧率和分辨率的联系与区别
  • **CI中自动类加载的用法总结
  • .NET CF命令行调试器MDbg入门(四) Attaching to Processes