解决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 相关文章推荐
用js实现预览待上传的本地图片
Mar 15 Javascript
window.name代替cookie的实现代码
Nov 28 Javascript
JS 实现导航栏悬停效果(续2)
Sep 24 Javascript
纯CSS3代码实现滑动开关效果
Aug 19 Javascript
JavaScript构造函数详解
Dec 27 Javascript
json格式数据的添加,删除及排序方法
Jan 21 Javascript
基于JS实现无缝滚动思路及代码分享
Jun 07 Javascript
JS 动态判断PC和手机浏览器实现代码
Sep 21 Javascript
JavaScript实现星星等级评价功能
Mar 22 Javascript
使用VScode 插件debugger for chrome 调试react源码的方法
Sep 13 Javascript
Vue触发input选取文件点击事件操作
Aug 07 Javascript
vue移动端下拉刷新和上滑加载
Oct 27 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中curl_multi的应用
2013/07/17 PHP
PHP转盘抽奖接口实例
2015/02/09 PHP
php用户登录之cookie信息安全分析
2016/05/13 PHP
php实现HTML实体编号与非ASCII字符串相互转换类实例
2016/11/02 PHP
实例讲解PHP中使用命名空间
2019/01/27 PHP
Gambit vs ForZe BO3 第三场 2.13
2021/03/10 DOTA
JQuery 表格操作(交替显示、拖动表格行、选择行等)
2009/07/29 Javascript
js最简单的拖拽效果实现代码
2010/09/24 Javascript
jQuery EasyUI API 中文文档 - NumberSpinner数值微调器使用介绍
2011/10/21 Javascript
JavaScript 反科里化 this [译]
2012/09/20 Javascript
dreamweaver 8实现Jquery自动提示
2014/12/04 Javascript
javascript实现单击和双击并存的方法
2014/12/13 Javascript
jquery控制页面部分刷新的方法
2015/06/24 Javascript
Javascript仿新浪游戏频道鼠标悬停显示子菜单效果
2015/08/21 Javascript
jQuery插件easyUI实现通过JS显示Dialog的方法
2016/09/16 Javascript
微信小程序 解决请求服务器手机预览请求不到数据的方法
2017/01/04 Javascript
JS实现闭包中的沙箱模式示例
2017/09/07 Javascript
浅谈angularJS2中的界面跳转方法
2018/08/31 Javascript
vue绑定事件后获取绑定事件中的this方法
2018/09/15 Javascript
jQuery实现适用于移动端的跑马灯抽奖特效示例
2019/01/18 jQuery
vue双向绑定及观察者模式详解
2019/03/19 Javascript
Python脚本在Appium库上对移动应用实现自动化测试
2015/04/17 Python
Python3多线程爬虫实例讲解代码
2018/01/05 Python
解决python爬虫中有中文的url问题
2018/05/11 Python
python matplotlib库直方图绘制详解
2019/08/10 Python
django之自定义软删除Model的方法
2019/08/14 Python
详解python statistics模块及函数用法
2019/10/27 Python
使用PyQt5实现图片查看器的示例代码
2020/04/21 Python
英国高档百货连锁店:John Lewis
2017/11/20 全球购物
Herve Leger官网:标志性绷带连衣裙等
2018/12/26 全球购物
实习教师个人的自我评价
2013/11/08 职场文书
小孩百日宴答谢词
2014/01/15 职场文书
加强作风建设工作总结
2014/10/23 职场文书
独生子女证明范本
2015/06/19 职场文书
安全教育培训心得体会
2016/01/15 职场文书
Mysql调整优化之四种分区方式以及组合分区
2022/04/13 MySQL