解决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 event事件的传递与冒泡处理
Dec 06 Javascript
JQuery入门—编写一个简单的JQuery应用案例
Jan 03 Javascript
js获取url参数值的两种方式
Sep 10 Javascript
原生js做的手风琴效果的导航菜单
Nov 08 Javascript
js清理Word格式示例代码
Feb 13 Javascript
JS根据生日算年龄的方法
May 05 Javascript
Bootstrap模块dropdown实现下拉框响应
May 22 Javascript
jQuery Easyui Datagrid实现单行的上移下移及保存移动的结果
Aug 15 Javascript
详解angularJS+Ionic移动端图片上传的解决办法
Sep 13 Javascript
浅谈SpringMVC中post checkbox 多选框value的值(隐藏域方式)
Jan 08 Javascript
vue.js 2.0实现简单分页效果
Jul 29 Javascript
原生JavaScript实现滑动拖动验证的示例代码
Dec 06 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
10 个经典PHP函数
2013/10/17 PHP
php抽奖概率算法(刮刮卡,大转盘)
2020/04/17 PHP
win10下 php安装seaslog扩展的详细步骤
2020/12/04 PHP
JQUERY 浏览器判断实现函数
2009/08/20 Javascript
使用JavaScript 实现各种跨域的方法
2013/05/08 Javascript
javascript js 操作数组 增删改查的简单实现
2016/06/20 Javascript
jQuery 全选 全部选 反选 实现代码
2016/08/17 Javascript
关于验证码在IE中不刷新的快速解决方法
2016/09/23 Javascript
利用jquery正则表达式在页面验证url网址输入是否正确
2017/04/04 jQuery
利用JS实现简单的瀑布流加载图片效果
2017/04/22 Javascript
node.js中EJS 模板快速入门教程
2017/05/08 Javascript
JS实现图片放大镜插件详解
2017/11/06 Javascript
vue2 前端搜索实现示例
2018/02/26 Javascript
在 Angular-cli 中使用 simple-mock 实现前端开发 API Mock 接口数据模拟功能的方法
2018/11/28 Javascript
vue 自动化路由实现代码
2019/09/03 Javascript
微信小程序上传图片并等比列压缩到指定大小的实例代码
2019/10/24 Javascript
微信小程序实现底部弹出模态框
2020/11/18 Javascript
[00:08]DOTA2勇士令状等级奖励“天外飞星”
2019/05/24 DOTA
Python编程二分法实现冒泡算法+快速排序代码示例
2018/01/15 Python
python3 实现验证码图片切割的方法
2018/12/07 Python
python使用pygame模块实现坦克大战游戏
2020/03/25 Python
python+selenium实现简历自动刷新的示例代码
2019/05/20 Python
python join方法使用详解
2019/07/30 Python
Django项目主urls导入应用中views的红线问题解决
2019/08/10 Python
Python模块future用法原理详解
2020/01/20 Python
pyecharts调整图例与各板块的位置间距实例
2020/05/16 Python
HTML5中视频音频的使用详解
2017/07/07 HTML / CSS
前台领班岗位职责
2013/12/04 职场文书
拓展培训心得体会
2014/01/04 职场文书
应届生如何写自荐信
2014/01/05 职场文书
企业军训感想
2014/02/07 职场文书
班主任经验交流会主持词
2014/04/01 职场文书
关于热爱祖国的演讲稿
2014/05/04 职场文书
关于军训的感想
2015/08/07 职场文书
MySQL主从复制断开的常用修复方法
2021/04/07 MySQL
mysql序号rownum行号实现方式
2022/12/24 MySQL