解决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 相关文章推荐
Add a Picture to a Microsoft Word Document
Jun 15 Javascript
JavaScript Konami Code 实现代码
Jul 29 Javascript
JS获取url链接字符串 location.href
Dec 23 Javascript
详解JavaScript中getFullYear()方法的使用
Jun 10 Javascript
AngularJS中监视Scope变量以及外部调用Scope方法
Jan 23 Javascript
解决微信内置浏览器返回上一页强制刷新问题方法
Feb 05 Javascript
深入浅析JSONAPI在PHP中的应用
Dec 24 Javascript
详解ES6中的 Set Map 数据结构学习总结
Nov 06 Javascript
layui实现下拉复选功能的例子(包括数据的回显与上传)
Sep 24 Javascript
解决vue cli使用typescript后打包巨慢的问题
Sep 30 Javascript
详解Vue的ref特性的使用
Jan 24 Javascript
原生JavaScript实现购物车
Jan 10 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的魔术方法__get()和__set()使用介绍
2012/09/19 PHP
理解PHP中的stdClass类
2014/04/18 PHP
PHP生成器简单实例
2015/05/13 PHP
刷新PHP缓冲区为你的站点加速
2015/10/10 PHP
PHP实现操作redis的封装类完整实例
2015/11/14 PHP
XAMPP升级PHP版本实现步骤解析
2020/09/04 PHP
Firefox outerHTML实现代码
2009/06/04 Javascript
js检测iframe是否加载完成的方法
2015/11/26 Javascript
JavaScript简单实现鼠标移动切换图片的方法
2016/02/23 Javascript
vue.js指令v-model实现方法
2016/12/05 Javascript
基于Bootstrap的Java开发问题汇总(Spring MVC)
2017/01/15 Javascript
JavaScript实现垂直滚动条效果
2017/01/18 Javascript
requirejs按需加载angularjs文件实例
2017/06/08 Javascript
十大 Node.js 的 Web 框架(快速提升工作效率)
2017/06/30 Javascript
解决vue打包之后静态资源图片失效的问题
2018/02/21 Javascript
详谈js的变量提升以及使用方法
2018/10/06 Javascript
原生JS实现列表内容自动向上滚动效果
2019/05/22 Javascript
浅谈JSON5解决了JSON的两大痛点
2020/12/14 Javascript
如何在JavaScript中使用localStorage详情
2021/02/04 Javascript
python实现类的静态变量用法实例
2015/05/08 Python
从零开始学Python第八周:详解网络编程基础(socket)
2016/12/14 Python
python使用pil库实现图片合成实例代码
2018/01/20 Python
Python File readlines() 使用方法
2018/03/19 Python
numpy linalg模块的具体使用方法
2019/05/26 Python
HTML5+CSS3实现机器猫
2016/10/17 HTML / CSS
英国户外玩具儿童游乐设备网站:TP Toys(蹦床、攀爬框架、秋千、滑梯和游戏屋)
2018/04/09 全球购物
C/C++有关内存的思考题
2015/12/04 面试题
财务专业大学生职业生涯规划范文
2013/12/30 职场文书
办公室综合文员岗位职责范本
2014/02/13 职场文书
三项教育活动实施方案
2014/03/30 职场文书
我为党旗添光彩演讲稿
2014/09/10 职场文书
2015年学校党支部工作总结
2015/04/01 职场文书
2016年10月份红领巾广播稿
2015/12/21 职场文书
2019年七夕情人节浪漫祝福语大全!
2019/08/08 职场文书
MySQL 数据表操作
2022/05/04 MySQL