有没 http 协议大神,求助回答一个 authorization 的问题

2015-03-02 13:45:56 +08:00
 shuson

先上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的通信。求解释

4266 次点击
所在节点    HTTP
9 条回复
southwolf
2015-03-02 14:04:08 +08:00
想想也知道,如果request没有send,都不知道server端需不需要验证,怎么可能弹框……
必然是发了一个请求,服务器那边说不行,浏览器才灰溜溜地找你要密码嘛……
binux
2015-03-02 14:09:26 +08:00
LZ 知道 callback 吗?
lerry
2015-03-02 14:14:01 +08:00
$ 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里要求认证
shuson
2015-03-02 15:18:39 +08:00
@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
lerry
2015-03-02 17:07:59 +08:00
请求-->发现需要认证-->prompt让你输入账号密码-->带着认证信息再次请求
learnshare
2015-03-02 17:17:19 +08:00
@lerry +1
111111111111
2015-03-02 18:23:07 +08:00
readyState不就是请求返回的结果吗
invite
2015-03-02 20:56:21 +08:00
@shuson 什么叫试试看,本来就是发送没有username和password的,只不过服务器回应说需要密码,他才弹出提示让用户输入的。 if - else 的过程。
@lerry +1
tux
2015-03-02 22:42:31 +08:00
var str='账号:密码';
var enstr=BASE64.encode(str);
xml.setRequestHeader("Authorization","Basic " + enstr);

这样发送就能通过验证了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/173935

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX