我正在尝试使用 JavaScript (jQuery) 登录我的 Netgear 路由器:
username = "admin";
password = "myrouterpassword";
url = "http://192.168.1.1";
async = false;
type = "GET";
timeout = 3000;
$.ajax({url:url, type:type, async:async,
username:username, password:password,
success: function(reponse) {.. stuff ..},
error: function(error) {.. stuff ..}
});
这会在 Firefox 中返回“拒绝访问受限 URI”错误,在 Chrome 中返回“NetworkError:发生网络错误”。我不相信这是一个跨域问题,因为我正在使用与 192.168.1.2 上的另一个资源极其相似的 jQuery 构造进行调用,并且它的工作方式就像一个魅力(除了不受密码保护,所以我不是使用用户名和密码字段)。
我的 jQuery 版本是 1.9.1。我在这里尝试了几种变体。例如,将此添加到 ajax 选项中:
xhrFields:{ withCredentials: true }
而且我还尝试不使用用户名和密码字段,而是使用标头而不是使用 Base 64 计算身份验证并使用它:
headers:{'Authorization':auth}
我还尝试了较旧的推荐方法:
beforeSend:function(req) { req.setRequestHeader('Authorization', auth); }
当我在后端使用 Python 访问这个路由器时,它完全可以工作:
passman = urllib2.HTTPPasswordMgrWithDefaultRealm()
passman.add_password(None, baseurl, username, password)
authhandler = urllib2.HTTPBasicAuthHandler(passman)
opener = urllib2.build_opener(authhandler)
urllib2.install_opener(opener)
devhandle= urllib2.urlopen(baseurl+'/DEV_device.htm')
devcontent=devhandle.read()
这给了我连接到这个路由器的设备列表。我真的需要在 Javascript 中执行此操作,并且知道我能够连接到完全相同域 (192.168.1.x) 中的其他设备,这表明它应该是可行的。对所有建议开放,非常感谢任何帮助!
附加信息:我添加了dataType:"html"并且错误更改为 *NS_ERROR_DOM_BAD_URI*。添加dataType:"json"会导致同样的事情。当我将其更改为dataType:"jsonp"并同时出现xhrFields:{ withCredentials: true }时,我看到路由器的登录框突然弹出!所以,它显然是到达路由器的。我显然不希望这样 - 登录应该默默地发生,但它仍然是一些东西。我现在登录时在错误消息中得到了这个:{“readyState”:4,“status”:200,“statusText”:“success”}. 登录弹出窗口是暂时的(自然是因为一旦我登录,它就不会再次提示我)。还在折腾。如果我让它工作,我会更新。如果有一些想法,请告诉我。
CHROME CONSOLE INFO:这是我在控制台中看到的:
Resource interpreted as Script but transferred with MIME type text/html: "http://192.168.1.1/?callback=jQuery19109538986752741039_1379841839394&_=1379841839396". jquery-1.9.1.js:8336
send jquery-1.9.1.js:8336
jQuery.extend.ajax jquery-1.9.1.js:7978
ajaxnow mainscreen.htm:79
onclick mainscreen.htm:1
Uncaught SyntaxError: Unexpected token <
ajaxnow() 是我的脚本中进行 .ajax 调用的函数。