gpt4 book ai didi

java - HttpURLConnection.getResponseCode()奇怪的行为

转载 作者:行者123 更新时间:2023-12-03 11:55:06 24 4
gpt4 key购买 nike

import java.io.IOException;
import java.net.Authenticator;
import java.net.CookieHandler;
import java.net.CookieManager;
import java.net.CookiePolicy;
import java.net.HttpURLConnection;
import java.net.PasswordAuthentication;
import java.net.URL;

public class Test {

private static class UserAuthenticator extends Authenticator {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication("username", "password".toCharArray());
}
}

public static void main(String[] args) {
System.setProperty("http.proxyHost", "127.0.0.1");
System.setProperty("http.proxyPort", "8080");

Authenticator.setDefault(new UserAuthenticator());
//CookieManager cookieManager = new CookieManager(null, CookiePolicy.ACCEPT_ORIGINAL_SERVER);
//CookieHandler.setDefault(cookieManager);

try {
URL url = new URL("http://123.123.123.123");
HttpURLConnection httpCon = (HttpURLConnection) url.openConnection(); //Connection is still close

int code = httpCon.getResponseCode(); //Instead of generating a single request, this generates a bunch of them
} catch (IOException e) {}
}
}

getResponceCode()方法向服务器生成多个请求,而不是JavaDocs所述的单个请求。我将JVM与BurpSuite链接在一起,这是一个非常好的代理,因此,我很确定这不是代理问题或类似问题。

如果有人能帮助我并向我解释为什么会发生,我将不胜感激。

我还提到,如果启用cookie管理器,它将仅生成两个请求。第一个获取401响应代码,第二个获取299响应代码(这意味着第二个请求成功),然后停止。为什么会这样呢?

同样,在第一个请求上不发送身份验证凭据,但在第二个请求之后的每个请求上都发送身份验证凭据。为什么会这样呢?

[编辑]

我正在发布通信的标题:

不使用Cookie:

请求1:
GET / HTTP/1.1
User-Agent: Java/1.8.0_144
Host: 192.168.1.1
Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2
Connection: close

回应1:
HTTP/1.0 401 Unauthorized
Date: Fri, 10 Nov 2017 11:56:36 GMT
Server: Boa/0.94.13
Connection: close
WWW-Authenticate: Basic realm="H108NS"
Content-Type: text/html; charset=ISO-8859-1
Set-Cookie: SESSIONID=4ee8135d;

要求2:
GET / HTTP/1.1
User-Agent: Java/1.8.0_144
Host: 192.168.1.1
Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2
Authorization: Basic YWRtaW46cGFzc3dvcmQ=
Connection: close

回应2:
HTTP/1.0 401 Unauthorized
Date: Fri, 10 Nov 2017 11:56:38 GMT
Server: Boa/0.94.13
Connection: close
WWW-Authenticate: Basic realm="H108NS"
Content-Type: text/html; charset=ISO-8859-1
Set-Cookie: SESSIONID=2ac98489;

Request2和Response2重复大约10-20次。
这是没有 cookies 。尝试使用Cookie会发生这种情况:

带Cookie的Request1:
GET / HTTP/1.1
User-Agent: Java/1.8.0_144
Host: 192.168.1.1
Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2
Connection: close

带有cookie的Response1:
HTTP/1.0 401 Unauthorized
Date: Fri, 10 Nov 2017 12:02:01 GMT
Server: Boa/0.94.13
Connection: close
WWW-Authenticate: Basic realm="H108NS"
Content-Type: text/html; charset=ISO-8859-1
Set-Cookie: SESSIONID=4b33e52e;

带cookie的Request2:
GET / HTTP/1.1
User-Agent: Java/1.8.0_144
Host: 192.168.1.1
Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2
Authorization: Basic YWRtaW46cGFzc3dvcmQ=
Cookie: SESSIONID=4b33e52e
Connection: close

带有cookie的Response2:
HTTP/1.0 200 OK
Content-type: text/html;charset=ISO-8859-1

最佳答案

您要描述的是带有身份验证的HTTP的工作方式。第一个请求是在没有凭据的情况下发生的。服务器的状态码为401的响应告诉客户端要求进行身份验证,并且还包含该信息支持/接受哪些身份验证机制。客户端使用此信息来创建包含身份验证的后续请求。

根据身份验证机制,您可能会看到两个以上的请求,例如NTLM导致几个请求-响应周期。在您的情况下,我认为确实发生了BASIC或DIGEST身份验证。

由于HTTP是无状态的,因此所有请求都需要身份验证信息,这就是为什么所有后续请求也都包含凭据的原因。这是机制相关的,例如再次使用NTLM,请求中的详细信息看起来有所不同。

要查看正在发生的事情,您可以启动诸如Wireshark之​​类的网络分析器,在其中可以查看每个erquest/response周期的请求和响应。

利用您提供的跟踪信息,服务器似乎需要您的cookie值来跟踪身份验证后的 session 。这就是为什么您会收到“401未经授权”作为响应的原因。

关于java - HttpURLConnection.getResponseCode()奇怪的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47218054/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com