javascript中AJAX 跨域问题解决方法

最近在开发过程中,使用ajax去异步调取图片。在开发中这个功能没什么问题,可以后来提测,重新部署之后就有问题了,这就是ajax的跨域问题。

ajax本身是不支持跨域的,这是由于javascript的同源策略所导致。但是我们可以通过其他方法来解决ajax的跨域问题。

1  由于我们是利用了jquery来写的ajax,我们一开始是准备 利用jsonp来解决的,客户端类似下面写法

 代码如下 复制代码

$.ajax({
    type : "get",
    async:false,
    url : "http://www.xxx.com/ajax.do",
    dataType : "jsonp",
    jsonp: "callbackparam",//服务端用于接收callback调用的function名的参数
    jsonpCallback:"success_jsonpCallback",//callback的function名称
    success : function(json){
        alert(json);
        alert(json[0].name);
    },
    error:function(){
        alert('fail');
    }
});

服务器端写法

public void ProcessRequest (HttpContext context) {
    context.Response.ContentType = "text/plain";
    String callbackFunName = context.Request["callbackparam"];
    context.Response.Write(callbackFunName + "([ { name:"John"}])");
}

这个方法其实蛮简单的,跟我们之前写的改动不大。

2  由于我们这次项目开发的页面比较多,改动起来涉及的地方就比较多了。最后是采取的 直接修改nginx配置实现的。平时对反向代理的理解也就是 缓存、安全、负载均衡,所以查了下方向代理

反向代理(Reverse Proxy),顾名思义,就是代理的反向功能。我们使用代理,可以访问一些我们所不能直接访问到的网络,或者可以隐藏自己的真实身份。而反向代理,可以在不暴露内部服务器的情况下,让外部用户访问我们内部、防火墙后的服务。

使用反向代理主要有以下好处:

1  请求的统一控制,包括设置权限、过滤规则等;

2  隐藏内部服务真实地址,暴露在外的只是反向代理服务器地址;

3  实现负载均衡,内部可以采用多台服务器来组成服务器集群,外部还是可以采用一个地址访问;

 4 解决Ajax跨域问题。

 5 作为真实服务器的缓冲,解决瞬间负载量大的问题。

项目完成之后,对ajax跨域问题在网上查了查,还知道了通过HTML中可以请求跨域资源的标签引用来达到跨域的目的,其实jsonp本质上就是采用了这种办法。

HTML中可以请求跨域资源的标签是很多的,

Script无疑是最合适的。在请求每一个脚本资源时,浏览器都会去解析并运行脚本文件内定义的函数,或需要马上执行的JavaScript代码,我们可以通过服务器返回一段脚本或JSON对象,在浏览器解析执行,从而达到跨域请求的目的。使用script标签来实现跨域请求,只能使用get方法请求服务器资源。并且传参的长度也受到地址栏长度的限制。

补充:有了jQuery之后,如何来解决ajax的跨域问题:

 代码如下 复制代码

<html>
<head>
<title>JQuery学习</title>
<script src="jquery-1.4.2.min.js" type="text/javascript"></script>
<script type="text/javascript">
$(document).ready(function(){
    var oBtnTest = $("#btnTest");
    oBtnTest.click(function(){
        oBtnTest.disabled = true;   
        var oResult = $("#result");
        oResult.html("loading").css("color","red");
        jQuery.getScript("http://www.111cn.net /test/js.txt",
        function(){           
            oResult.html("name:" + Dylan.name + "<br/>email:" + Dylan.email).css("color","black");           
            oBtnTest.disabled = false;           
        });        
    });   
});   
</script>
</head>
<body>
<button id="btnTest">BtnTest</button>
<div id="result"></div>
</body>
</html>

远程服务器端js.txt中的内容为:
var Dylan= {name:"Dylan",email:Dylan@163.com}
笔者感觉这种方式更加简洁。呵呵。当然,读者可以根据实际情况,任意选择实现方式。
怎么样,其实很简单吧,我看到过很多人不愿意去正视ajax所存在的技术瓶颈,其实AJAX更应该是Ajax而不是AJAX,突出第一个A是想强调其实AJAX发扬的是一种异步传输的方法,而不是具体到底使用了哪种技术。
其实,在json数据格式之后,有一种更牛X的“jsonp”,也可以实现ajax的跨域通信。其实jsonp不是一种数据格式,只是对我介绍的第二种方式做了改进。从jQuery1.2 版本开始,jQuery 拥有对 JSONP 回调的本地支持。

时间: 2024-10-30 22:19:36

javascript中AJAX 跨域问题解决方法的相关文章

jquery中ajax跨域方法实例分析_jquery

本文实例分析了jquery中ajax跨域.分享给大家供大家参考,具体如下: JSONP是一个非官方的协议,它允许在服务器端集成Script tags返回至客户端,通过javascript callback的形式实现跨域访问 方法一: jsonp之 getJSON js var url = "http://localhost/mytest/jsonp_php.php?callback=?"; $.getJSON(url, { "age": 21, "name

jquery ajax跨域解决方法介绍

 本篇文章只要是对jquery ajax跨域解决方法(json方式)进行了介绍,需要的朋友可以过来参考下,希望对大家有所帮助 最近公司开发的项目中很多地方需要跨域ajax请求,比如几个子域名下  http://a.****.com/index123.aspx,  http://b.****.com/index2.aspx    都要请求用户json信息,然后再对数据进行处理,起初我和同事们试了很多种方法,使用$.ajax() 无论是get或post方法都会引起uri deny的错误.一番GG之后

使用JavaScript 实现各种跨域的方法_基础知识

一.一些概念 ①传统Ajax:交互的数据格式--自定义字符串或XML描述: 跨域--通过服务器端代理解决. ②如今最优方案:使用JSON格式来传输数据,使用JSONP来跨域. ③JSON:一种数据交换格式.基于纯文本.被原生JS支持.     格式:两种数据类型描述符:大括号{ }.方括号[ ].分隔符逗号.映射符冒号.定义符双引好. ④JSONP:一种跨域数据交互协议,非官方. 1.Web页面调用js文件,可跨域.扩展:但凡有src属性的标签都具有跨域能力. 2.跨域服务器 动态生成数据 并存

js中ajax跨域之cors几个例子分析

由于安全限制(同源策略, 即JavaScript或Cookie只能访问同域下的内容),ajax跨域请求的两种方案 方案一:jsonp (JSON with Padding)    但是jsonp有一个缺点就是不支持get传参 方案二:CORS(跨域资源共享,Cross-Origin Resource Sharing) 此方案支持post提交     假设我们在http://www.a域名.com域名ajax请求http://www.111cn.net域名下的数据:若使用cors来实现,ajax跨

Ajax跨域问题解决(Ajax JSONP)

因WEB安全原因,Ajax默认情况下是不能进行跨域请求的,遇到这种问题,自然难不倒可以改变世界的程序猿们,于是JSONP(JSON with Padding)被发明了,其就是对JSON的一种特殊,简单来说就是在原有的JSON数据上做了点手脚,从而达到可以让网页可以跨域请求.在现在互联网技术对"前后分离"大规模应用的时期,JSONP可谓意义重大啊. 假设我们原来的JSON数据为 {"hello":"你好","veryGood":

jquery ajax跨域解决方法(json方式)_jquery

最近公司开发的项目中很多地方需要跨域ajax请求,比如几个子域名下 http://a.****.com/index123.aspx, http://b.****.com/index2.aspx 都要请求用户json信息,然后再对数据进行处理,起初我和同事们试了很多种方法,使用$.ajax() 无论是get或post方法都会引起uri deny的错误.一番GG之后发现了解决方法,也了解其中的原因. jquery从1.2开始,.getJSON就支持跨域操作了.使用jquery.getJSON()方法

javascript中IFrame跨域高度自适应实现代码

同域时Iframe高度自适应 下面的代码兼容IE/Firefox浏览器,控制id为"iframeid"的iframe的高度,通过JavaScript取得被嵌套页面最终高度,然后在主页面进行设置来实现. 另外,请注意此解决方案仅供同域名下使用.  代码如下 复制代码     <script type="text/javascript">       function SetCwinHeight(){         var iframeid=documen

IE浏览器中ajax返回undefined问题解决方法

出现这样的问题,是因为文件保存编码和页面显示编码不一至造成的.各种浏览器,没有统一的规范,特别是IE,做浏览器兼容时,是比较郁闷的.下面模拟一下这个问题. 1,test.php采用gbk或者gb2312编码    代码如下 复制代码 <?php  header("content-Type: text/html; charset=utf8");//设置页面显示为utf8  echo "aaa";  die;  2,index.html  代码如下 复制代码 &l

IE8中ajax 跨域获取html模板解决方法

报错: statusText :"No Transport"   1,只有当浏览器是IE8 时才引入js: Html代码   <!--[if IE 8]>       <script type="text/javascript"               src="http://${static_domain}/chanjet/js/lib/common/jQuery.XDomainRequest.js"></sc