AJAX跨域访问出现\'没有权限\'的错误

2016-02-19 19:20 18 1 收藏

下面请跟着图老师小编一起来了解下AJAX跨域访问出现\'没有权限\'的错误,精心挑选的内容希望大家喜欢,不要忘记点个赞哦!

【 tulaoshi.com - Web开发 】

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

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=url    oBao.open('get',my_url,false);     oBao.onreadystatechange=function(){         if(oBao.readyState==4){              if(oBao.status=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=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 =200){                var returnStr=oBao.responseText;                document.write(returnStr);              }else{                document.write("未找到您输入的地址或服务器505错误!");              }         }    }    oBao.send(null);   }  getWebPage('http://www.google.cn');  /script 保存这段代码到test.html,在本地直接用IE打开没问题,但将该段代码上传到服务器后,问题出现了--JS提示"没有权限"错误!!!这该如何解决呢?

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

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/webkaifa/)

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

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/webkaifa/)

下面开始组织代码,首先是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 Reg= new 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编码格式。用第二种方法就不会出现这样的问题了,只要定义了编码格式的站点就能正常返回信息(这里不能包括一些使用特别编码的站点)。

来源:http://www.tulaoshi.com/n/20160219/1620759.html

延伸阅读
标签: Web开发
就是我自己写的一个ajax类,能正确返回结果,也能正确通过json解析数据,但是在firefox的错误控制台里边却总是有错误——“未组织好”出现。虽然程序能正确运行,但总让人觉得不爽。在google里边用“ajax 未组织好”搜索,虽然也有类似的问题,但是竟然没有人给出答复。 今天突发奇想,下载了firefox的英文版本,然后在里边调试同样的网页,发...
标签: Web开发
在使用vbscript进行asp开发时,一些朋友会碰到以下类似的错误: Microsoft VBscript 运行时错误 '800a000d' 类型不匹配: '*******' /solweb/sdbottm_right.asp, line 80 错误原因: 该错误是因为在运行iis服务的windows 2003 server上安装了Internet Explorer 6 Service Pack 1 (KB832894)安全更新...
标签: Web开发
网页制作Webjx文章简介:要解决ajax跨域问题,网上给出的方法有二. 要解决ajax跨域问题,网上给出的方法有二: 1是构建服务器端的代理。简而言之,就是ajax中调用的实质还是本机的url,而服务器端替js去取回远端地址。 2.利用script标记,生成一个标签。在js加载完成后,再执行后续操作。 就是将原来新建xmlHTT...
标签: Web开发
var re = /&/g; var str = "http://www.163.com?id=333&r=999&o=000"; str.replace(re,"&");
代码如下: public class DBOpenHelper extends SQLiteOpenHelper {  // 类没有实例化,不能用作父类构造器的参数,必须声明为静态  public DBOpenHelper(Context context, int version) {   super(context, "SQLite.db", null, version);   // 第三个参数CursorFactory指定在执行查询时获得一个游标实例的工厂...

经验教程

228

收藏

6
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部