ajax跨域相关

ajax 技术使用xmlhttprequest组件附送请求时,发送请求的url和本网页的url地址必须在同一个域名下
如果需要跨域,可以使用iframe或者<javascript src="url"></script>的方式
 
http://www.cnblogs.com/Spring/archive/2008/10/21/1315882.html
http://exceptioneye.iteye.com/blog/1405495 
 
 

新的W3C策略实现了HTTP跨域访问,还亏我找了很久的资料解决这个问题:
只需要在servlet中返回的头部信息中添加Access-Control-Allow-Origin这个既可。
比如我要开放所有我本地的跨域访问,就设置如下:response.setHeader("Access-Control-Allow-Origin", "http://127.0.0.1/*");
这样我本地的A工程中的AJAX请求就可以跨域请求B工程中的servlet。

   1: var scriptBlock = document.createElement("script");
   2:  
   3: function StartGet()
   4: {
   5:     scriptBlock.src = "";
   6:     scriptBlock.src = "http://Domain2/GetData.aspx";
   7:     scriptBlock.type = "text/javascript";
   8:     scriptBlock.language = "javascript";
   9:     document.getElementsByTagName("head")[0].appendChild(scriptBlock);
  10:     scriptBlock.onreadystatechange = ReturnData;
  11: }
  12:  
  13: function ReturnData()
  14: {
  15:     //alert(scriptBlock.readyState);
  16:  
  17:     //uninitialized        Object is not initialized with data. 
  18:     //loading            Object is loading its data. 
  19:     //loaded            Object has finished loading its data. 
  20:     //interactive       User can interact with the object even though it is not fully loaded. 
  21:     //complete          Object is completely initialized. 
  22:  
  23:     if("loaded" == scriptBlock.readyState)
  24:     {
  25:         var div = document.getElementById("htmldiv");
  26:         div.innerHTML = a.project[0].name; //a是返回的json里面的变量
  27:     }    
  28: }
 
 
 
 
 
 
 
 
 
 
 

<!doctype html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="Generator" content="EditPlus®">
  <meta name="Author" content="">
  <meta name="Keywords" content="">
  <meta name="Description" content="">
  <title>Document</title>
</head>
<body>
<script src="jquery-1.8.3.min.js"></script>
   <script type="text/javascript"> 
     jQuery(document).ready(function(){  
        $.ajax({ 
             type: "GET", 
             async: false, 
             //url: "http://test/jsonp.php"
             url:"http://local.ok.com/1.php"
             dataType: "jsonp", 
             jsonp: "callback",//传递给请求处理程序或页面的,用以获得jsonp回调函数名的参数名(一般默认为:callback) 
             jsonpCallback:"bbb",//自定义的jsonp回调函数名称,默认为jQuery自动生成的随机函数名,也可以写"?",jQuery会自动为你处理数据 
             success: function(json){ 
                 alert('您查询到航班信息:票价: ' + json.price + ' 元,余票: ' + json.tickets + ' 张。回调函数名为: '+json.func); 
             }, 
             error: function(){ 
                 alert("fail"); 
             } 
         }); 
     }); 
     </script>

</body>
</html>

跨域问题存在实际上源于浏览器的同源策略(same origin policy),简单讲,同源就是要求域名,协议,端口三者都一致;

  1. //使用jsonp实现跨全域
  2. RequestAjax_JSONP = function() {  
  3. var obj = $("#crossSitePage");  
  4. $.getJSON("http://coolkiss.com/CrossSite.jsp?callback=?&t=" + Math.random(), function(data) {  
  5. //alert(data);
  6. $("#ResponseData").html(data.content);  
  7. });  
  8. }

1、一个众所周知的问题,Ajax直接请求普通文件存在跨域无权限访问的问题,甭管你是静态页面、动态网页、web服务、WCF,只要是跨域请求,一律不准;

2、不过我们又发现,Web页面上调用js文件时则不受是否跨域的影响(不仅如此,我们还发现凡是拥有"src"这个属性的标签都拥有跨域的能力,比如<script>、<img>、<iframe>);

3、于是可以判断,当前阶段如果想通过纯web端(ActiveX控件、服务端代理、属于未来的HTML5之Websocket等方式不算)跨域访问数据就只有一种可能,那就是在远程服务器上设法把数据装进js格式的文件里,供客户端调用和进一步处理;

4、恰巧我们已经知道有一种叫做JSON的纯字符数据格式可以简洁的描述复杂数据,更妙的是JSON还被js原生支持,所以在客户端几乎可以随心所欲的处理这种格式的数据;

5、这样子解决方案就呼之欲出了,web客户端通过与调用脚本一模一样的方式,来调用跨域服务器上动态生成的js格式文件(一般以JSON为后缀),显而易见,服务器之所以要动态生成JSON文件,目的就在于把客户端需要的数据装入进去。

6、客户端在对JSON文件调用成功之后,也就获得了自己所需的数据,剩下的就是按照自己需求进行处理和展现了,这种获取远程数据的方式看起来非常像AJAX,但其实并不一样。

7、为了便于客户端使用数据,逐渐形成了一种非正式传输协议,人们把它称作JSONP,该协议的一个要点就是允许用户传递一个callback参数给服务端,然后服务端返回数据时会将这个callback参数作为函数名来包裹住JSON数据,这样客户端就可以随意定制自己的函数来自动处理返回数据了。

如果对于callback参数如何使用还有些模糊的话,我们后面会有具体的实例来讲解。

上面都是网络上收集的

简单点说,解决ajax跨域

1、response.setHeader("Access-Control-Allow-Origin", http://127.0.0.1/*);

2、设置domain

3、jsonp(jsonp就是js动态创建iframe后者script标签请求服务器,服务器返回的是一个js的可执行回调方法。)

4、通过带有src属性字样的标签处理,比如,<script><img><iframe>

上一篇:Myeclipse 2016 & 2014 下载


下一篇:Mysql 分区详解