解决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 相关文章推荐
firefox浏览器不支持innerText的解决方法
Aug 07 Javascript
解决jquery版本冲突的有效方法
Sep 02 Javascript
javascript学习小结之prototype
Dec 03 Javascript
AngularJS内建服务$location及其功能详解
Jul 01 Javascript
jQuery简单实现中间浮窗效果
Sep 04 Javascript
微信小程序 视图层(xx.xml)和逻辑层(xx.js)详细介绍
Oct 13 Javascript
解决AngualrJS页面刷新导致异常显示问题
Apr 20 Javascript
js图片放大镜实例讲解(必看篇)
Jul 17 Javascript
jQuery实现table中两列CheckBox只能选中一个的示例
Sep 22 jQuery
详解基于vue的服务端渲染框架NUXT
Jun 20 Javascript
Vue的自定义组件不能使用click方法的解决
Jul 28 Javascript
element-ui点击查看大图的方法示例
Dec 14 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
《星际争霸II》全新指挥官斯台特曼现已上线
2020/03/08 星际争霸
php中使用Curl、socket、file_get_contents三种方法POST提交数据
2011/08/12 PHP
PHP提取字符串中的图片地址[正则表达式]
2011/11/12 PHP
IIS安装Apache伪静态插件的具体操作图文
2013/07/01 PHP
php全角字符转换为半角函数
2014/02/07 PHP
PHP中使用CURL模拟登录并获取数据实例
2014/07/01 PHP
CentOS 6.3下安装PHP xcache扩展模块笔记
2014/09/10 PHP
php将12小时制转换成24小时制的方法
2015/03/31 PHP
ThinkPHP 模板substr的截取字符串函数详解
2017/01/09 PHP
JavaScript 判断用户输入的邮箱及手机格式是否正确
2013/12/08 Javascript
JavaScript DOM节点添加示例
2014/07/16 Javascript
DOM操作一些常用的属性汇总
2015/03/13 Javascript
Jquery实现瀑布流布局(备有详细注释)
2015/07/31 Javascript
JS基于clipBoard.js插件实现剪切、复制、粘贴
2016/05/03 Javascript
微信小程序 实战小程序实例
2016/10/08 Javascript
Bootstrap轮播图的使用和理解4
2016/12/14 Javascript
JSON字符串和JSON对象相互转化实例详解
2017/01/05 Javascript
jquery easyui DataGrid简单示例
2017/01/23 Javascript
jQuery插件HighCharts绘制简单2D折线图效果示例【附demo源码】
2017/03/21 jQuery
Vue.js实战之利用vue-router实现跳转页面
2017/04/01 Javascript
mpvue+vuex搭建小程序详细教程(完整步骤)
2018/09/30 Javascript
分享5个小技巧让你写出更好的 JavaScript 条件语句
2018/10/20 Javascript
[02:22:36]《加油!DOTA》总决赛
2014/09/19 DOTA
python读文件保存到字典,修改字典并写入新文件的实例
2018/04/23 Python
python将txt等文件中的数据读为numpy数组的方法
2018/12/22 Python
使用python绘制3维正态分布图的方法
2018/12/29 Python
科尔士百货公司官网:Kohl’s
2016/07/11 全球购物
开办饭店创业计划书
2013/12/28 职场文书
软件项目开发计划书
2014/05/01 职场文书
2014年小学重阳节活动策划方案
2014/09/16 职场文书
银行委托书范本
2014/09/28 职场文书
幼师中班个人总结
2015/02/12 职场文书
撤诉申请怎么写
2015/05/19 职场文书
2015年司法局工作总结
2015/05/22 职场文书
残联2016年全国助残日活动总结
2016/04/01 职场文书
Pytorch反向传播中的细节-计算梯度时的默认累加操作
2021/06/05 Python