在Firefox中通过AJAX跨域访问Web资源

本文为原创,如需转载,请注明作者和出处,谢谢!

一、解决在firefox中无法跨域访问的问题

AJAX从本质上讲就是命名用XMLHttpRequest组件来向服务端发送HTTP请求,请接收相应信息。至于成功接收到响应信息后的操作,就和普通的Web客户端程序类似了(一般用DOM将信息加到HTML组件中)。但问题就发生在了XMLHttpRequest组件上。虽然在大多数浏览器中(包括IEFirefox等)都叫这个名子。使用方法也类似。但在进行某些操作时却有不同的效果。

就拿跨域访问的问题来说。让我们先看看如下的html中的javascript代码:

test.html


<html>
    
<head>
        
<title></title>
        
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<script type="text/javascript"> 

// 获得IE和firefox浏览器中的XMLHttpRequest对象
function getXMLHTTPRequest()
{
    var myRequest = null;
    if(window.XMLHttpRequest)   // firefox
    {        
        myRequest 
= new XMLHttpRequest(); 
    }
    else if(typeof ActiveXObject != "#ff0000")  // IE
    {              
        myRequest 
= new ActiveXObject("Microsoft.XMLHTTP");
    }          
    return myRequest;          
}

var myRequest;
function onReadyState()   // XMLHttpRequest处理异步访问状态时的事件
{
    if(myRequest.readyState == 4)   // 4表示成功获得相应信息
    {              
        var msg = document.getElementById("msg");
        msg.value 
= myRequest.responseText             
    }
}
function getServiceText()
{     
    myRequest 
= getXMLHTTPRequest();
    if(myRequest)
    {         
        myRequest.onreadystatechange 
= onReadyState;      
        try 
        {
            myRequest.open( 
"post""http://www.blogjava.net"true);
        }
        catch(exception)
        {
           
var msg = document.getElementById("msg");
            msg.value 
= exception;  
         } 
         myRequest.send(
"test");
    }         
}

</script>
    
</head>
    
<body>
        
<input id="msg" type="text" />
        
<input type="button" value="信息" onclick="getServiceText()" />
    
</body>
</html>

如果在IE中访问上面的html文件,url如下:

http://localhost:8080/test.html

     会弹出一个对话框,大概意思是说您已经跨域访问了,可能存在风险,是否继续。如果继续执行的话,仍然可以访问http://www.blogjava.net。但是在firefox中却更本无法访问其它域的url,并且会抛出“调用方法 XMLHttpRequest.open 时权限不足”异常。解决的方法一般有两种,一种是修改firefox的设置,在firefox的地址栏中输入“about:config”,并找到signed.applets.codebase_principal_support,将其设为true。如图1所示。



                                               图1

但这种方法经过实现,仍然无法访问其他域的url,不知是不是新版的firefox把这个给屏蔽了。就算这种方法可行,也尽量不使用这种需要配置firefox的方法,而要使用编程的方法,在访问其它域之前,可以使用如下代码打开权限:

try 

    netscape.security.PrivilegeManager.enablePrivilege(
"UniversalBrowserRead"); 
}
catch (exception)

    alert(exception); 
}

要注意的是,上面的代码只能用在firefox中,因此,要将其放到只有firefox才能执行到的代码块中,如在下面的块中:

if(window.XMLHttpRequest)   // firefox
{        
    
try 
    { 
        netscape.security.PrivilegeManager.enablePrivilege(
"UniversalBrowserRead"); 
    }
    
catch (exception)
    { 
        alert(exception); 
    }
}


    不能将上面的代码放到getXMLHTTPRequest中,应放到getServiceText中。

注:如果test.html在通过web服务器访问,而是按着访问本地文件时访问test.html时,在IE中不会出现上述的提示对话框,而是直接就可以访问其他的域。

二、其他的跨浏览器问题

不同浏览器的XMLHttpRequest虽然接口一样,但在不同浏览器中调用XMLHttpRequest的方法和属性的效果不同。如send方法,在IE中可以不传参数,如myRequest.send();仍然可以正常工作,而在firefox中,必须为send方法传一个参数,也就是说,在firefoxsend方法参数没有默认值,必须为其赋值。为了通用起见,建议所有的send方法都为其赋一个参数值,哪怕是空串。

除了send方法,responseText属性也是一样,在IE中,responseText返回了整个web资源的内容,而在firefox中只返回web资源的第一行。



posted on 2008-05-15 16:56 银河使者 阅读(1876) 评论(17)  编辑 收藏 所属分类: ajaxwebjavascript 原创

评论

#1楼  2008-05-15 17:07 snowwolflibo      

netscape.security.PrivilegeManager.enablePrivilege("UniversalBrowserRead");
这种方法似乎很暴力   回复  引用  查看    

#2楼  2008-05-15 17:13 喷射器 [未注册用户]

这种方法还不算暴力   回复  引用    

#3楼  2008-05-15 17:35 镜涛      

为什么标准不能统一呢!哎   回复  引用  查看    

#4楼  2008-05-15 18:43 小弱      

ie7 中的xmlhttprequest如何呢?   回复  引用  查看    

#5楼 [楼主] 2008-05-15 19:31 银河使者      

xmlhttprequest不是ie中的,只是一个com组件。和ie没关系。   回复  引用  查看    

#6楼  2008-05-15 22:14 小弱      

xmlhttprequest在ie6中是以com组件的形式实现的,在ie7 firefox是原生的。   回复  引用  查看    

#7楼 [楼主] 2008-05-15 22:29 银河使者      

还没在ie7中试过,但不知在ie7中是使用myRequest = new ActiveXObject("Microsoft.XMLHTTP");来创建xmlhttprequest对象吗?还是用其他方式。我机器上没有ie7。由于必须要用ie6,所以没安ie7。

但firefox上的肯定是原生的。   回复  引用  查看    

#8楼  2008-05-16 11:00 dataflow1 [未注册用户]

safari下呢?
LZ有办法吗?   回复  引用    

#9楼  2008-05-16 12:05 簡簡單單..      

IE7: var Ajax = new ActiveXObject("Msxml2.XMLHTTP.7.0");   回复  引用  查看    

#10楼 [楼主] 2008-05-16 12:07 银河使者      

这不还是com组件吗   回复  引用  查看    

#11楼  2008-05-16 16:31 nicye      

跨域访问不安全,一定要跨域访问的话建议自己做个页面来中转   回复  引用  查看    

#12楼  2008-05-17 11:02 求知无傲      

kankan   回复  引用  查看    

#13楼  2008-05-18 12:46 簡簡單單..      

同意11楼..   回复  引用  查看    

#14楼 [楼主] 2008-05-18 12:53 银河使者      

本文只是就事论事,至于在程序中是否用跨域访问,将跨域访问应用到什么地方。完全取决于开发人员的需求和程序的要求。本文只是提供了一种解决方案而已。既然firefox和ie都支持跨域访问,那也就是说,在某些特殊情况下,还是需要这种技术的,否则,干脆把它屏蔽了算了!!-^-   回复  引用  查看    

#15楼  2008-05-18 20:49 张五 [未注册用户]

在firefox2.0。0.14中似乎不起作用。   回复  引用    

#16楼  2008-07-15 15:56 angel010 [未注册用户]

如果不在本地静态测试,好像仍然不可以   回复  引用    


标题  
姓名  
主页
Email (只有博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2008-05-22 17:07 编辑过
 
另存  打印
 


<2008年5月>
27282930123
45678910
11121314151617
18192021222324
25262728293031
1234567

导航

统计

公告

请使用站内搜索:
(不要按回车,请直接点击查询按钮)



我的其它Blog:

nokiaguy.blogjava.net

与我联系

常用链接

留言簿(3)

我参与的团队

我的标签

随笔分类(101)

随笔档案(50)

相册

搜索

积分与排名

最新评论

阅读排行榜

评论排行榜

60天内阅读排行