js跨域
什么引起了ajax不能跨域请求的问题?
ajax本身实际上是通过XMLHttpRequest对象来进行数据的交互,而浏览器出于安全考虑,不允
许js代码进行跨域操作,所以会警告。
有什么完美的解决方案么?
解决方案有不少,但是只能是根据自己的实际情况来选择。
跨域的安全限制都是指浏览器端来说的,服务器端是不存在跨域安全限制的。所以针对这2种情况
衍生出2类跨域解决方案,一类是服务器端做中转类似代理方式,一类是js处理浏览器端的真正跨
域访问。
具体情况有:
1)本域和子域的相互访问: https://www.doczj.com/doc/aa14114058.html,和https://www.doczj.com/doc/aa14114058.html,用document.domain =
"https://www.doczj.com/doc/aa14114058.html,";
2)本域和其他域的相互访问: https://www.doczj.com/doc/aa14114058.html,和https://www.doczj.com/doc/aa14114058.html, 用XMLHttpRequest访问代理,
既服务器端代理方式
3)本域和其他域的相互访问: https://www.doczj.com/doc/aa14114058.html,和https://www.doczj.com/doc/aa14114058.html, 用 JS创建动态脚本,
标签的src属性实现跨域访问
解决方法:
1)如果想做到数据的交互,那么https://www.doczj.com/doc/aa14114058.html,和https://www.doczj.com/doc/aa14114058.html,必须由你来开发才可以。可
以将https://www.doczj.com/doc/aa14114058.html,用iframe添加到 https://www.doczj.com/doc/aa14114058.html,的某个页面下,在https://www.doczj.com/doc/aa14114058.html,和
iframe里面都加上document.domain = "https://www.doczj.com/doc/aa14114058.html,",这样就可以统一域了,可以实现
跨域访问。就和平时同一个域中镶嵌iframe一样,直接调用里面的JS就可以了。
2)这种情形是最经常遇到的,也是用的最多的了。就是https://www.doczj.com/doc/aa14114058.html,和https://www.doczj.com/doc/aa14114058.html,你只能
修改一个,也就是另外一个是别人的,人家告诉你你要取得数据就访问某某连接参数是什
么样子的,最后返回数据是什么格式的。而你需要做的就是让你的服务器端充当中转代理,让服务器去别人的网站上取得数据,再返回给浏览器端。
服务器端充当中转代理方式有很多可以由服务器端程序实现,也可以修改服务器配置实现,下面举例Apache重写(mod_rewrite proxy模式)方式:
在Apache的安装目录下的conf/httpd.conf文件添加如下语句:
LoadModuleproxy_module modules/mod_proxy.so
LoadModuleproxy_http_module modules/mod_proxy_http.so
LoadModulerewrite_module modules/mod_rewrite.so
RewriteEngine On
RewriteRule ^/_proxy/(.*)$ http://$1 [P,L]
这样就可以把其他网站的url映射为本服务器的/_proxy/目录下面, 例如可以这么访问
百度https://www.doczj.com/doc/aa14114058.html,/_proxy/https://www.doczj.com/doc/aa14114058.html,
3)这个的区别就是请求是使用
https://www.doczj.com/doc/aa14114058.html,/b.jsp页面代码如下:
$(param.jsoncallback)({"name": "Zhang Huihua", "QQ": "350863780"})
b.jsp页面通过$(param.jsoncallback)得到浏览器端随后要回调的js function name:myTest
实际上客户端接收到的response如下:myTest({"name": "Zhang Huihua", "QQ": "350863780"})
jQuery浏览器端跨域访问
目前jQuery$.ajax()支持get方式的跨域,这其实是采用jsonp的方式来完成的。其原理就是
上面第三种方式,是一致的(qq空间就是大量采用这种方式来实现跨域数据交换的) .JSONP是一种脚本注入(Script Injection)行为,所以也有一定的安全隐患.
注意,jquey是不支持post方式跨域的.
虽然采用post +动态生成iframe是可以达到post跨域的目的(有位js牛人就是这样把
jquery1.2.5 打patch的),但这样做是一个比较极端的方式,不建议采用.
也可以说get方式的跨域是合法的,post方式从安全角度上,被认为是不合法的, 万不得已还是不
要剑走偏锋..
浏览器端跨域访问的需求看来也引起w3c的注意了,看资料说html5 WebSocket标准支持跨域
的数据交换,应该也是一个将来可选的跨域数据交换的解决方案.
jQuery Ajax 全解析【.ajax .post .get】 1. load( url, [data], [callback] ) :载入远程 HTML 文件代码并插入至 DOM 中。 url (String) : 请求的HTML页的URL地址。 data (Map) : (可选参数) 发送至服务器的 key/value 数据。 callback (Callback) : (可选参数) 请求完成时(不需要是success的)的回调函数。 这个方法默认使用 GET 方式来传递的,如果[data]参数有传递数据进去,就会自动转换为POST方式的。jQuery 1.2 中,可以指定选择符,来筛选载入的 HTML 文档,DOM 中将仅插入筛选出的 HTML 代码。语法形如 "url #some > selector"。 这个方法可以很方便的动态加载一些HTML文件,例如表单。 示例代码: $(".ajax.load").load("https://www.doczj.com/doc/aa14114058.html,/QLeelulu/archive/2008/03 /30/1130270.html .post", function (responseText, textStatus, XMLHttpRequest){ this;//在这里this指向的是当前的DOM对象,即 $(".ajax.load")[0] //alert(responseText);//请求返回的内容 //alert(textStatus);//请求状态:success,error //alert(XMLHttpRequest);//XMLHttpRequest对象 }); 注:不知道为什么URL写绝对路径在FF下会出错,知道的麻烦告诉下。下面的get()和post()示例使用的是绝对路径,所以在FF下你将会出错并不会看到返回结果。还有get()和post()示例都是跨域调用的,发现传上来后没办法获取结果,所以把运行按钮去掉了。 2. jQuery.get( url, [data], [callback] ):使用GET方式来进行异步请求 参数: url (String) : 发送请求的URL地址.
A网站首页PHP(也可以在登录页面加入下面的代码)加入如下代码 view plaincopy to clipboardprint? 1. A网站增加文件getcookies.php,目的是为了让B网站可以以ajax方式来查询A网站的cookie getcookies.php 代码如下 view plaincopy to clipboardprint? 1.$winduid,'msg'=>$msg)); 4.//可以用json_encode自动转换,也可以手写json格 式 $json_data = '{"mywinduid":'.$mywinduid.'}'; 5.$json_data = json_encode(array('mywinduid'=>$mywinduid)); 6.//必需以下这样形式输出,重点就是发送请求的网页的参数中要有jsoncallback参 数 7.echo $callback.'('.$json_data.')'; 8.?> 在需要查询A网站cookie的B网站页面中增加如下代码 view plaincopy to clipboardprint? 1. 2.
jQuery确实是一个挺好的轻量级的JS框架,能帮助我们快速的开发JS应用,并在一定程度上改变了我们写JavaScript代码的习惯。 废话少说,直接进入正题,我们先来看一些简单的方法,这些方法都是对jQuery.ajax()进行封装以方便我们使用的方法,当然,如果要处理复杂的逻辑,还是需要用到jQuery.ajax()的(这个后面会说到). 1. load( url, [data], [callback] ) :载入远程HTML 文件代码并插入至DOM 中。 url (String) : 请求的HTML页的URL地址。 data (Map) : (可选参数) 发送至服务器的key/value 数据。 callback (Callback) : (可选参数) 请求完成时(不需要是success的)的回调函数。 这个方法默认使用GET 方式来传递的,如果[data]参数有传递数据进去,就会自动转换为POST方式的。jQuery 1.2 中,可以指定选择符,来筛选载入的HTML 文档,DOM 中将仅插入筛选出的HTML 代码。语法形如"url #some > selector"。 这个方法可以很方便的动态加载一些HTML文件,例如表单。 示例代码: $(".ajax.load").load("[url]https://www.doczj.com/doc/aa14114058.html,/QLeelulu/archive/2008/03/30/1130270.html[/url] .post", function (responseText, textStatus, XMLHttpRequest){ this;//在这里this指向的是当前的DOM对象,即$(".ajax.load")[0] //alert(responseText);//请求返回的内容 //alert(textStatus);//请求状态:success,error //alert(XMLHttpRequest);//XMLHttpRequest对象 }); 这里将显示结果。 注:不知道为什么URL写绝对路径在FF下会出错,知道的麻烦告诉下。下面的get()和post()示例使用的是绝对路径,所以在FF下你将会出错并不会看到返回结果。还有get()和post()示例都是跨域调用的,发现传上来后没办法获取结果,所以把运行按钮去掉了。 2. jQuery.get( url, [data], [callback] ):使用GET方式来进行异步请求 参数: url (String) : 发送请求的URL地址. data (Map) : (可选) 要发送给服务器的数据,以Key/value 的键值对形式表示,会做为QueryString附加到请求URL中。 callback (Function) : (可选) 载入成功时回调函数(只有当Response的返回状态是success才是调用该方法)。 这是一个简单的GET 请求功能以取代复杂$.ajax 。请求成功时可调用回调函数。如果需要在出错时执行函数,请使用$.ajax。示例代码: $.get("./Ajax.aspx", {Action:"get",Name:"lulu"}, function (data, textStatus){ //返回的 data 可以是 xmlDoc, jsonObj, html, text, 等等. this; // 在这里this指向的是Ajax请求的选项配置信息,请参考下图
JSONP(JSON With Padding),就是打包在函数调用中的的JSON(或者包裹的JSON)。AJAX和JSONP在jQuery中的调用方式看起来极为相像,千万不要被这种现象迷惑,它们本质上有很大不同。AJAX是通过XMLHttpRequest对象获取非页面内容,而JSONP是动态的添加