莞易网络:专业东莞网站建设,东莞域名注册,东莞网络公司,东莞网络,东莞网站制作,东莞网页设计,东莞电子画册,东莞光盘制作! 设为首页  |  加入收藏  |  联系我们

最新公告
·莞易网络获得东莞首批联通4006/铁通4007/电信4008授权代理业务,咨询热线:4…
旗下网站:光盘网  电子画册网  邮箱网  华正IDC     
 
首 页 | 域名注册 | 虚拟主机 | 网站建设 | 电子画册 | 电子名片 | 光盘制作 | 多媒体 | 企业邮箱 | 网络推广 | 网站优化 | 摄影摄像 | 400电话 | 程序定制 | 客户案例 | 联系我们
  网站建设优惠套餐 更多 >>
  实惠型网站套餐
  推广型网站套餐
  定制型网站套餐
  域名注册 更多 >>
  国际域名: .com 100元/年
  国内域名: .cn 100元/年
  英文.HK: .hk 350元/年
  中文.HK: .hk 400元/年
  虚拟主机 更多 >>
  ASP100M动态空间,200元/年
  ASP200M动态空间,390元/年
  ASP300M动态空间,590元/年
  ASP500M动态空间,990元/年
  电子画册 更多 >>
擎瀚电子画册
擎瀚电子画册
AJAX跨域访问出现“没有权限”的错误——莞易网络|东莞网站建设|东莞网站设计|东莞做网站|电子画册设计|电子杂志设计|东莞网络公司|东莞光盘制作|电子名片制作
首页 >> 建站知识
AJAX跨域访问出现“没有权限”的错误
信息来源:莞易网络         发布时间:2010-02-03        浏览次数:313

很多人在使用AJAX调用别人站点内容的时候,JS会提示"没有权限"错误,这是XMLHTTP组件的限制-安全起见禁止访问非同域的网站,下面一个例子来访问http://www.google.cn,

01.<script type="text/javascript">
02.function createobj() {
03.if (window.ActiveXObject) {
04. return new ActiveXObject("Microsoft.XMLHTTP");
05. }
06. else if (window.XMLHttpRequest) {
07. return new XMLHttpRequest();
08. }
09.}
10.
11.function getWebPage(url) {
12. var oBao=createobj();
13. var my_url=url
14. oBao.open('get',my_url,false);
15. oBao.onreadystatechange=function(){
16. if(oBao.readyState==4){
17. if(oBao.status=<script type="text/javascript">
18.function createobj() {
19.if (window.ActiveXObject) {
20. return new ActiveXObject("Microsoft.XMLHTTP");
21. }
22. else if (window.XMLHttpRequest) {
23. return new XMLHttpRequest();
24. }
25.}
26.
27.function getWebPage(url) {
28. var oBao=createobj();
29. var my_url=url
30. oBao.open('get',my_url,false);
31. oBao.onreadystatechange=function(){
32. if(oBao.readyState==4){
33. if(oBao.status==200){
34. var returnStr=oBao.responseText;
35. document.write(returnStr);
36. }else{
37. document.write("未找到您输入的地址或服务器505错误!");
38. }
39. }
40. }
41. oBao.send(null);
42.}
43.getWebPage('http://www.google.cn');
44.</script>
45.=200){
46. var returnStr=oBao.responseText;
47. document.write(returnStr);
48. }else{
49. document.write("未找到您输入的地址或服务器505错误!");
50. }
51. }
52. }
53. oBao.send(null);
54.}
55.getWebPage('http://www.google.cn');
56.</script>

 

保存这段代码到test.html,在本地直接用IE打开没问题,但将该段代码上传到服务器后,问题出现了--JS提示"没有权限"错误!!!这该如何解决呢?

下面思考一下:既然不能访问非同域的,只能访问同域的地址了,同域的动态文件怎么获取非同域网页内容呢?我们还是想到的AJAX,只不过这个AJAX是在服务器端执行.

大体思路是这样的:首先将URL用AJAX提交给自己站内的文件,例如getPage.asp---在getPage.asp再次通过服务器XMLHTTP来访问提交来的URL---将获取的内容返回给提交URL的页----显示内容

下面开始组织代码,首先是test.html文件

  • <script type="text/javascript"> 
  • function createobj() {  
  • if (window.ActiveXObject) {  
  •          return new ActiveXObject("Microsoft.XMLHTTP");  
  •      }  
  •      else if (window.XMLHttpRequest) {  
  •          return new XMLHttpRequest();  
  •      }  
  • }  
  •  
  • function getWebPage(url) {  
  •   var oBao=createobj();  
  •   var my_url="getpage.asp?url="+escape(url);  
  •   oBao.open('get',my_url,false);   
  •   oBao.onreadystatechange=function(){  
  •        if(oBao.readyState==4){  
  •             if(oBao.status==200){  
  •               var returnStr=oBao.responseText;  
  •               document.write(returnStr);  
  •             }else{  
  •               document.write("未找到您输入的地址或服务器505错误!");  
  •             }  
  •        }  
  •   }  
  •   oBao.send(null);   
  • }  
  • getWebPage('http://www.google.cn');  
  • </script> 
  •  
  • 再就是getpage.asp文件(注意:要以UTF-8格式保存本文件,防止乱码),如下:  
  •  
  •  
  • <%  
  • response.charset="UTF-8" 
  • reg="\<meta.+ charset= {0,}([^\"" \>\/]*).+\/{0,1}\>" 
  • '函数名:GetResStr  
  • '作用:获取指定URL的HTML代码  
  • '参数:URL-要获取的URL  
  • function GetResStr(URL)  
  • err.clear  
  • dim ResBody,ResStr,PageCode,ReturnStr  
  • Set Http=createobject("MiCROSOFT.XMLHTTP")   
  • Http.open "GET",URL,False   
  • Http.Send()   
  • If Http.Readystate =4 Then   
  •   If Http.status=200 Then  
  •     ResStr=http.responseText  
  •     ResBody=http.responseBody  
  •     PageCode=GetCode(ResStr,reg)  
  •     ReturnStr=BytesToBstr(http.responseBody,PageCode)  
  •     GetResStr=ReturnStr 
  •   End If   
  • End If   
  • End Function  
  •  
  • '函数名:BytesToBstr  
  • '作用:转换二进制数据为字符  
  • '参数:Body-二进制数据,Cset-文本编码方式  
  • Function BytesToBstr(Body,Cset)   
  •   Dim Objstream   
  •   Set Objstream = CreateObject("adodb.stream")   
  •   objstream.Type = 1   
  •   objstream.Mode =3   
  •   objstream.Open   
  •   objstream.Write body   
  •   objstream.Position = 0   
  •   objstream.Type = 2   
  •   objstream.Charset =Cset   
  •   BytesToBstr = objstream.ReadText   
  •   objstream.Close   
  •   set objstream = nothing   
  • End Function  
  •  
  • '函数名:GetCode  
  • '作用:转换二进制为字符  
  • '参数:str-待查询字符串,regstr-正则表达式  
  • Function GetCode(str,regstr)  
  • Dim Reg,serStr  
  • set Regnew RegExp  
  • Reg.IgnoreCase = True 
  • Reg.MultiLine = True 
  • Reg.Pattern =regstr 
  • if Reg.test(str) then '若查询到匹配项  
  •    Set Cols = Reg.Execute(str)  
  •    serStr=Cols(0).SubMatches(0) '使用匹配到的第一个匹配项  
  • else '否则给个默认值gb2312,有点省懒法,如果页面没给出编码格式,想知道确实有点麻烦  
  •    serStr="gb2312" 
  • end if  
  • GetCode=serStr 
  • end function  
  •  
  • dim url:url=request.querystring("url")  
  • response.write GetResStr(URL)  
  • %>
  • 代码组织完毕,实验下,成功提取http://www.google.cn的内容!!!!!这样就可以解决"没有权限"的问题了。 其实,单纯一个getpage.asp一样能获取,不过不能像js那样动态的处理DOM。

    还有一个问题,如果你用第一种方法访问http://www.baidu.com会出现乱码,因为baidu编码为GB2312,而XMLHTTP返回的是UTF-8编码格式。用第二种方法就不会出现这样的问题了,只要定义了编码格式的站点就能正常返回信息(这里不能包括一些使用特别编码的站点)。

      
    东莞网站建设 东莞网络公司 东莞网页设计 东莞电子画册 东莞网站设计 东莞电子名片 东莞网络 东莞光盘设计

    关于我们   新闻动态   网站建设   建站知识   行业新闻   常见问题   企业邮箱   空间申请   域名注册   地理位置   联系我们   友情链接

    Copy Right©2005-2009 0769easy.com, All Rights Reserved.  版权所有:莞易网络  
    电话:400-600-9492   0769- 23605736 89876525 13925797170  E-mail:821007@163.com  地址:东莞市南城区建设路2号金升国际A栋20楼
    24小时服务热线:400-600-9492 13650059292 15019194373  客服QQ:438498514  客服MNS:my0769vip@163.com
    http://www.0769easy.com www.0769easy.cn  信息产业部备案编号:粤ICP备05012034号

    东莞市华正网科技有限公司   企业注册号:441900000785719