解决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读取ASP设定的COOKIE
Nov 24 Javascript
通用javascript脚本函数库 方便开发
Oct 13 Javascript
菜鸟学习JavaScript小实验之函数引用
Nov 17 Javascript
jquery多行滚动/向左或向上滚动/响应鼠标实现思路及代码
Jan 23 Javascript
原始的js代码和jquery对比体会
Sep 10 Javascript
AngularJS入门教程之迭代器过滤详解
Aug 18 Javascript
jQuery实现的自定义滚动条实例详解
Sep 20 Javascript
angularjs实现下拉列表的选中事件示例
Mar 03 Javascript
解决Vue中mounted钩子函数获取节点高度出错问题
May 18 Javascript
vue请求本地自己编写的json文件的方法
Apr 25 Javascript
详解django模板与vue.js冲突问题
Jul 07 Javascript
Vuex的热更替如何实现
Jun 05 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 网页游戏开发入门教程一(webgame+design)
2009/10/26 PHP
解析PHP多种序列化与反序列化的方法
2013/06/06 PHP
PHP验证码函数代码(简单实用)
2013/09/29 PHP
汇总PHPmailer群发Gmail的常见问题
2016/02/24 PHP
php实现文件预览功能
2017/05/23 PHP
网页里控制图片大小的相关代码
2006/06/13 Javascript
JS URL传中文参数引发的乱码问题
2009/09/02 Javascript
jQuery ajax BUG:object doesn't support this property or method
2010/07/06 Javascript
jquery插件之easing 动态菜单
2010/08/21 Javascript
给事件响应函数传参数的四种方式小结
2013/12/05 Javascript
javascript中去除数组重复元素的实现方法【实例】
2016/04/12 Javascript
基于Bootstrap里面的Button dropdown打造自定义select
2016/05/30 Javascript
JavaScript Date 知识浅析
2017/01/29 Javascript
vue使用watch 观察路由变化,重新获取内容
2017/03/08 Javascript
利用vue开发一个所谓的数独方法实例
2017/12/21 Javascript
Vue.js递归组件构建树形菜单
2017/12/24 Javascript
JavaScript中变量、指针和引用功能与操作示例
2018/08/04 Javascript
150行Node.js实现的dns代理工具
2019/08/02 Javascript
Vue 防止短时间内连续点击后多次触发请求的操作
2020/11/11 Javascript
剖析Python的Twisted框架的核心特性
2016/05/25 Python
简单掌握Python的Collections模块中counter结构的用法
2016/07/07 Python
Python如何快速实现分布式任务
2017/07/06 Python
利用Django-environ如何区分不同环境
2018/08/26 Python
python3+requests接口自动化session操作方法
2018/10/13 Python
Python创建空列表的字典2种方法详解
2020/02/13 Python
Python导入模块包原理及相关注意事项
2020/03/25 Python
python多线程爬取西刺代理的示例代码
2021/01/30 Python
详解纯CSS3制作的20种loading动效
2017/07/05 HTML / CSS
Feelunique美国:欧洲大型的在线美妆零售电商
2018/11/04 全球购物
全球性的在线商店:Vogca
2019/05/10 全球购物
大学军训感想
2014/02/12 职场文书
火箭队口号
2014/06/18 职场文书
亚运会口号
2014/06/20 职场文书
求职导师推荐信范文
2015/03/27 职场文书
python opencv通过按键采集图片源码
2021/05/20 Python
使用Python解决图表与画布的间距问题
2022/04/11 Python