解决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 相关文章推荐
jQuery1.5.1 animate方法源码阅读
Apr 05 Javascript
jquery提取元素里的纯文本不包含span等里的内容
Sep 30 Javascript
JavaScript常用小技巧小结
Dec 29 Javascript
JQuery中Bind()事件用法分析
May 05 Javascript
javascript cookie用法基础教程(概念,设置,读取及删除)
Sep 20 Javascript
解决vue.js在编写过程中出现空格不规范报错的问题
Sep 20 Javascript
Jquery和CSS实现选择框重置按钮功能
Nov 08 jQuery
JavaScript实现汉字转换为拼音及缩写的方法示例
Mar 28 Javascript
jQuery实现动态加载(按需加载)javascript文件的方法分析
May 31 jQuery
基于JS实现计算24点算法代码实例解析
Jul 23 Javascript
js轮播图之旋转木马效果
Oct 13 Javascript
详解vue中使用transition和animation的实例代码
Dec 12 Vue.js
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
一个没有MYSQL数据库支持的简易留言本的编写
2006/10/09 PHP
PHP进阶学习之类的自动加载机制原理分析
2019/06/18 PHP
input按钮的事件处理大全
2010/12/10 Javascript
由Javascript实现的页面日历
2011/11/04 Javascript
根据选择不同的下拉值出现相对应的文本输入框
2013/08/01 Javascript
28个常用JavaScript方法集锦
2015/01/14 Javascript
javascript 获取浏览器版本
2015/01/21 Javascript
JavaScript让Textarea支持tab按键的方法
2015/06/26 Javascript
利用jquery实现实时更新歌词的方法
2017/01/06 Javascript
jQuery+PHP+Mysql实现抽奖程序
2020/04/12 jQuery
JavaScript使用Ajax上传文件的示例代码
2017/08/10 Javascript
vant 时间选择器--开始时间和结束时间实例
2020/11/04 Javascript
python 数据加密代码
2008/12/24 Python
python类继承用法实例分析
2015/05/27 Python
Python函数式编程指南(一):函数式编程概述
2015/06/24 Python
Python 性能优化技巧总结
2016/11/01 Python
详解Python中的静态方法与类成员方法
2017/02/28 Python
Python实现的文本编辑器功能示例
2017/06/30 Python
python使用super()出现错误解决办法
2017/08/14 Python
详解python中的装饰器
2018/07/10 Python
Python中新式类与经典类的区别详析
2019/07/10 Python
Python可变参数会自动填充前面的默认同名参数实例
2019/11/18 Python
selenium+Chrome滑动验证码破解二(某某网站)
2019/12/17 Python
django修改models重建数据库的操作
2020/03/31 Python
Python爬虫实例——爬取美团美食数据
2020/07/15 Python
HTML5 实战PHP之Web页面表单设计
2011/10/09 HTML / CSS
德国最大的拼图在线商店:Puzzle.de
2016/12/17 全球购物
Merchant 1948澳大利亚:新西兰领先的鞋类和靴子供应商
2018/03/24 全球购物
Bluebella美国官网:英国性感内衣品牌
2018/10/04 全球购物
希腊香水和化妆品购物网站:Parfimo.gr
2019/10/03 全球购物
美国购买韩国护肤和美容产品网站:Althea Korea
2020/11/16 全球购物
关于环保的建议书400字
2014/03/12 职场文书
捐献物资倡议书范文
2014/05/19 职场文书
尊老爱幼演讲稿
2014/09/04 职场文书
公务员学习习总书记“三严三实”思想汇报
2014/09/19 职场文书
防暑降温通知书
2015/04/27 职场文书