先上code:
var xmlhttp = new XMLHttpRequest();
xmlhttp.onreadystatechange = function() {
if(xmlhttp.readyState==1){
console.log('request opened ')
console.log(document.domain);
}
if(xmlhttp.readyState==2){
console.log('request header recieved ')
}
if(xmlhttp.readyState==4){
console.log('Request finished and response is ready \nResponse code: '+xmlhttp.status)
}
}
server需要authentication才可以访问。
我发现browser会在 xmlhttp 的readyState变成 Opened的时候就会prompt一个登录框。
这时候request还没有send,browser怎么知道需要username password呢?
我想在http request真正发送之前,肯定有个隐蔽的和server的通信。求解释
1
southwolf 2015-03-02 14:04:08 +08:00
想想也知道,如果request没有send,都不知道server端需不需要验证,怎么可能弹框……
必然是发了一个请求,服务器那边说不行,浏览器才灰溜溜地找你要密码嘛…… |
2
binux 2015-03-02 14:09:26 +08:00
LZ 知道 callback 吗?
|
3
lerry 2015-03-02 14:14:01 +08:00 1
$ curl -vv xxx.com
* Rebuilt URL to: xxx.com/ * Hostname was NOT found in DNS cache * Trying xxx.xxx.xxx.xxx... * Connected to xxx.com (xxx.xxx.xxx.xxx) port 80 (#0) > GET / HTTP/1.1 > User-Agent: curl/7.37.1 > Host: xxx.com > Accept: */* > < HTTP/1.1 401 Unauthorized < Server: xxx < Date: Mon, 02 Mar 2015 06:07:33 GMT < Content-Type: text/html < Content-Length: 644 < Connection: keep-alive < WWW-Authenticate: Basic realm="Restricted" < <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN"> <html> <head><title>401 Authorization Required</title></head>... 请求已经发了,header里要求认证 |
4
shuson OP @lerry 刚用fiddler看了看,发现如果是一个https的url,在xmlHttpRequest open后会有一个请求至https://xxxx:443的请求,之后跟着一个https://xxx的请求但是header里没有authentication,第三次才是header里带着authentication的请求发送给server
也就是说xhr会预先发送一个没有username 和 password的试试看,如果不行就respond一个401,再发一个有username和password的,如果username和password不对,就再次要求authentication |
5
lerry 2015-03-02 17:07:59 +08:00
请求-->发现需要认证-->prompt让你输入账号密码-->带着认证信息再次请求
|
6
learnshare 2015-03-02 17:17:19 +08:00
@lerry +1
|
7
111111111111 2015-03-02 18:23:07 +08:00 via Android
readyState不就是请求返回的结果吗
|
8
invite 2015-03-02 20:56:21 +08:00 1
|
9
tux 2015-03-02 22:42:31 +08:00 1
var str='账号:密码';
var enstr=BASE64.encode(str); xml.setRequestHeader("Authorization","Basic " + enstr); 这样发送就能通过验证了 |