解决AJAX中跨域访问出现'没有权限'的错误


Posted in Javascript onAugust 20, 2008

禁止访问非同域的网站,下面一个例子来访问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==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是在服务器端执行.
大体思路是这样的:首先将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 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编码格式。用第二种方法就不会出现这样的问题了,只要定义了编码格式的站点就能正常返回信息(这里不能包括一些使用特别编码的站点)。

Javascript 相关文章推荐
javascript 清除输入框中的数据
Apr 13 Javascript
jQuery load方法用法集锦
Dec 06 Javascript
js 利用image对象实现图片的预加载提高访问速度
Mar 29 Javascript
JS实现图片无间断滚动代码汇总
Jul 30 Javascript
用js提交表单解决一个页面有多个提交按钮的问题
Sep 01 Javascript
iframe跨域通信封装详解
Aug 11 Javascript
JQuery解析XML数据的几个简单实例
May 18 Javascript
详解webpack 入门总结和实践(按需异步加载,css单独打包,生成多个入口文件)
Jun 20 Javascript
实用的Vue开发技巧
May 30 Javascript
关于vue.js中实现方法内某些代码延时执行
Nov 14 Javascript
Element Card 卡片的具体使用
Jul 26 Javascript
vue 单页应用和多页应用的优劣
Oct 22 Javascript
javascript:void(0)的真正含义实例分析
Aug 20 #Javascript
利用404错误页面实现UrlRewrite的实现代码
Aug 20 #Javascript
一些不错的js函数ajax
Aug 20 #Javascript
jQuery formValidator表单验证插件开源了 含API帮助、源码、示例
Aug 14 #Javascript
jquery之Document元素选择器篇
Aug 14 #Javascript
JavaScript国旗变换效果代码
Aug 13 #Javascript
js活用事件触发对象动作
Aug 10 #Javascript
You might like
如何获得PHP相关资料
2006/10/09 PHP
PHP pathinfo()获得文件的路径、名称等信息说明
2011/09/13 PHP
浅析Dos下运行php.exe,出现没有找到php_mbstring.dll 错误的解决方法
2013/06/29 PHP
destoon二次开发入门示例
2014/06/20 PHP
php的优点总结 php有哪些优点
2019/07/19 PHP
jquery tools 系列 scrollable学习
2009/09/06 Javascript
Jquery 点击按钮显示和隐藏层的代码
2011/07/25 Javascript
jQuery创建自定义的选择器用以选择高度大于100的超链接实例
2015/03/18 Javascript
javascript图片预加载完整实例
2015/12/10 Javascript
基于Node.js实现nodemailer邮件发送
2016/01/26 Javascript
javascript cookie的简单应用
2016/02/24 Javascript
简单实现AngularJS轮播图效果
2020/04/10 Javascript
jQuery中hover方法搭配css的hover选择器,实现选中元素突出显示方法
2017/05/08 jQuery
js for终止循环 跳出多层循环
2018/10/04 Javascript
js 获取扫码枪输入数据的方法
2020/06/10 Javascript
深入解答关于Python的11道基本面试题
2017/04/01 Python
对python中的try、except、finally 执行顺序详解
2019/02/18 Python
python之yield和Generator深入解析
2019/09/18 Python
Python如何使用BeautifulSoup爬取网页信息
2019/11/26 Python
opencv-python 提取sift特征并匹配的实例
2019/12/09 Python
Python中文分词库jieba,pkusegwg性能准确度比较
2020/02/11 Python
matplotlib 多个图像共用一个colorbar的实现示例
2020/09/10 Python
jupyter notebook远程访问不了的问题解决方法
2021/01/11 Python
selenium与xpath之获取指定位置的元素的实现
2021/01/26 Python
Johnston & Murphy官网: 约翰斯顿·墨菲牛津总统鞋
2018/01/09 全球购物
Dodax奥地利:音乐、电影、书籍、玩具、电子产品等
2019/08/31 全球购物
一份全面的PHP面试问题考卷
2012/07/15 面试题
完美主义个人的自我评价
2014/02/17 职场文书
出纳试用期自我鉴定范文
2014/09/16 职场文书
群众路线专项整治方案
2014/10/27 职场文书
运动会100米广播稿
2015/08/19 职场文书
股东出资协议书
2016/03/21 职场文书
如何理解PHP核心特性命名空间
2021/05/28 PHP
万能密码的SQL注入漏洞其PHP环境搭建及防御手段
2021/09/04 SQL Server
HTML怎么设置下划线?html文字加下划线方法
2021/12/06 HTML / CSS
Python使用plt.boxplot()函数绘制箱图、常用方法以及含义详解
2022/08/14 Python