解决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面向对象编程之对象使用分析
Aug 19 Javascript
jquery动态添加删除一行数据示例
Jun 12 Javascript
jQuery实现的多级下拉菜单效果代码
Aug 24 Javascript
JS添加删除DIV的简单实例
Jul 08 Javascript
jQuery实现下拉框多选 jquery-multiselect 的实例代码
Jul 14 Javascript
Javascript中级语法快速入手
Jul 30 Javascript
Javascript实现信息滚动效果
May 18 Javascript
Javascript中绑定click事件的四种方式介绍
Oct 26 Javascript
React 组件渲染和更新的实现代码示例
Feb 21 Javascript
微信小程序JS加载esmap地图的实例详解
Sep 04 Javascript
初学vue出现空格警告的原因及其解决方案
Oct 31 Javascript
js实现日历
Nov 07 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 备份数据库代码(生成word,excel,json,xml,sql)
2013/06/23 PHP
PHP如何将XML转成数组
2016/04/04 PHP
javascript 简单抽屉效果的实现代码
2010/03/09 Javascript
$.getJSON在IE下失效的原因分析及解决方法
2013/06/16 Javascript
JavaScript实现的Tween算法及缓冲特效实例代码
2015/11/03 Javascript
详解JS正则replace的使用方法
2016/03/06 Javascript
基于BootStrap Metronic开发框架经验小结【八】框架功能总体界面介绍
2016/05/12 Javascript
基于jQuery实现点击列表加载更多效果
2016/05/31 Javascript
JS实现动态表格的添加,修改,删除功能(推荐)
2016/06/15 Javascript
基于jQuery的select下拉框选择触发事件实例分析
2016/11/18 Javascript
使用JS正则表达式 替换括号,尖括号等
2016/11/29 Javascript
jquery uploadify隐藏上传进度的实现方法
2017/02/06 Javascript
Vue.js render方法使用详解
2017/04/05 Javascript
electron demo项目npm install安装失败的解决方法
2018/02/06 Javascript
简化vuex的状态管理方案的方法
2018/06/02 Javascript
VUE实现吸底按钮
2021/03/04 Vue.js
Python装饰器使用示例及实际应用例子
2015/03/06 Python
详解Python使用Plotly绘图工具,绘制甘特图
2019/04/02 Python
python 批量添加的button 使用同一点击事件的方法
2019/07/17 Python
Python高级特性之闭包与装饰器实例详解
2019/11/19 Python
Python web如何在IIS发布应用过程解析
2020/05/27 Python
python 实现控制鼠标键盘
2020/11/27 Python
HTML5 video 事件应用示例
2014/09/11 HTML / CSS
浅析canvas元素的html尺寸和css尺寸对元素视觉的影响
2019/07/22 HTML / CSS
video实现有声音自动播放的实现方法
2020/05/20 HTML / CSS
印度最大的酒店品牌网络:OYO Rooms
2016/07/24 全球购物
雅诗兰黛旗下走天然植物路线的彩妆品牌:Prescriptives
2016/08/14 全球购物
英国复古皮包品牌:Beara Beara
2018/07/18 全球购物
100%羊绒:NakedCashmere
2020/08/26 全球购物
机关财务管理制度
2014/01/17 职场文书
社区国庆节活动方案
2014/02/05 职场文书
七年级历史教学反思
2014/02/05 职场文书
元旦促销方案
2014/03/15 职场文书
先进个人申报材料
2014/12/30 职场文书
2019大学生暑期实习心得总结
2019/08/21 职场文书
Go中使用gjson来操作JSON数据的实现
2022/08/14 Golang