【Java程序代理与系统代理关系】Java程序代理与系统代理关系优先级及覆盖关系

前言

使用Apache HttpClient工具包中的HttpClients.createDefault()方法创建的默认HTTP客户端会根据操作系统当前的设置来决定是否使用代理。

具体来说,当创建默认HTTP客户端时,它会检查系统的代理设置。如果操作系统当前设置了系统级代理,那么创建的默认HTTP客户端将自动使用该系统级代理进行请求。如果操作系统没有设置代理或者设置代理为直接连接(无代理),则创建的默认HTTP客户端将不使用任何代理。

这种行为是由Apache HttpClient的默认配置决定的,其会优先考虑操作系统级别的代理设置

如何禁用操作系统代理而直连目标服务器

//新建一个完全默认的HttpClientBuilder
HttpClientBuilder hb = HttpClients.custom().setProxy(null);
//调用build方法完成http客户端的构造
CloseableHttpClient httpClient = hb.build();

如何使用自定义代理

//新建一个完全默认的HttpClientBuilder
HttpClientBuilder hb = HttpClients.custom().setProxy(new HttpHost(ip,port));
//调用build方法完成http客户端的构造
CloseableHttpClient httpClient = hb.build();

Java程序代理与系统代理关系

Q:假设操作系统的系统代理是A服务器,而我们在Java代码中通过setProxy把代理服务器设置成了B服务器,那我的Java客户端发出一个访问C服务器的GET请求,那这个GET请求途径的服务器路线是下面的哪一种?
1.直接进入C服务器;
2.先进入A代理服务器,然后直接进入C服务器(即setProxy设置的代理被系统代理所覆盖);
3.先进入B代理服务器,然后直接进入C服务器(即系统代理被setProxy设置的代理所覆盖);
4.先进入B代理服务器,再进入A代理服务器,最后进入终点C;
5.先进入A代理服务器,再进入B代理服务器,最后进入终点C;

下面是Chatgpt3.5的回答:

根据你描述的情况,操作系统的系统代理是A服务器,而你在Java代码中通过setProxy将代理服务器设置为B服务器。在这种情况下,当Java客户端发送GET请求访问C服务器时,请求的路线将是选项3:先进入B代理服务器,然后直接进入C服务器。
这是因为在Java代码中通过setProxy设置的代理会覆盖操作系统的系统代理。所以,Java客户端会首先尝试将请求发送到B代理服务器,然后由B代理服务器转发请求到C服务器,而不会经过A代理服务器。

省流:

默认情况下,Java的Http客户端使用操作系统的全局代理
如果使用setProxy修改代理,无论是修改成另一个服务器,还是修改为null,都会覆盖掉操作系统的全局代理

你可能感兴趣的:(java,开发语言)