如何在Javascript中请求受密码保护的页面

时间:2011-03-11 16:38:25

标签: javascript xmlhttprequest windows-desktop-gadgets sidebar

我正在开发一个非常简单的边栏小工具来分析我的路由器的每月带宽使用情况,并确定我在该月的前方或后方。数据位于路由器托管的受密码保护的网页中(如果重要的话,我使用的是DD-WRT)。我想通过Javascript将页面请求传递给路由器以及所有身份验证信息,以便一次性检索页面,但我似乎找不到合适的语法。有什么想法吗?

到目前为止,这是我的代码:

var ua = navigator.userAgent.toLowerCase();
        if (!window.ActiveXObject){
          req = new XMLHttpRequest();
        }else if (ua.indexOf('msie 5') == -1){
          req = new ActiveXObject("Msxml2.XMLHTTP");
        }else{
          req = new ActiveXObject("Microsoft.XMLHTTP");
        }

        req.open('GET', 'http://192.168.1.1/Status_Internet.asp', false, "username", "password");   
        req.send(null);  
        if(req.status == 200){
           dump(req.responseText);
        } else{
            document.write("Error");
        }

        document.write("Second Error");

Firebug表示它在req.send(null)上抛出错误 - 具体来说, Access to restricted URI denied" code: "1012

可能是因为同源策略,但在这种情况下我可以使用什么而不是xmlhttpRequest?

4 个答案:

答案 0 :(得分:1)

因为同源策略,替代方案是iframe,但实际上并不能满足您的需求。

如果它是http-auth,您以前可以使用http://username:pass@site请求页面,但我必须承认我没有尝试使用它很长一段时间,所以我不知道它是否是仍然支持。

编辑:

如果这不起作用,也许您可​​以使用基本的http身份验证,如下所述:http://en.wikipedia.org/wiki/Basic_access_authentication但这需要您起诉服务器端代理,因为您无法在xhr时操纵来自javascript的请求标头不是一种选择。

答案 1 :(得分:0)

您需要在请求中添加Authorization标头。我不是AJAX专家,所以我不确定你是否可以修改AJAX请求中的头字段。如果你做不到,那你就注定了。

如果可以,那么this Wikipedia article contains an example它必须是什么样子。

答案 2 :(得分:0)

如果同源政策不是问题,那么 在您的网页上加载jQuery

并使用jQuery的$ .ajax方法。

$.ajax({
  url: "path/to/your/page.html", // self-explanatory
  password:"your password", // a string with your password.
  success: function(data){ // on sucsess:
  $("someDiv").html(data); // load in the retrived page
 }
});

有关详细信息,请参阅jQuery ajax API

答案 3 :(得分:0)

这是一个安全功能:你看,有恶意脚本使用类似的技术来破解路由器(无论如何谁更改了路由器密码?显然不是Joe X. Schmoe)。

Same Origin Policy下,AJAX请求仅限于它们所源自的域(和端口):因此,从本地页面,您无法向192.168.1.1:80发出请求。

有一种可能的解决方法 - 网络中的服务器端代理(例如PHP script that fetches the router pages for you)。