You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让Java所有连接使用JAVA_TOOL_OPTIONS配置的代理?

核心问题原因

Java默认的http.proxyHost、https.proxyHost等HTTP/HTTPS代理系统参数,仅作用于HttpURLConnection、JDK内置HttpClient等高层HTTP客户端实现,你用到的原生SSLSocket属于TCP层API,本身不会自动读取这类HTTP代理参数,这是你配置后不生效的根本原因。

无需修改代码的代理配置方案

场景1:你有可用的SOCKS代理

直接在JAVA_TOOL_OPTIONS环境变量中添加SOCKS代理的系统属性即可,JDK原生Socket/SSLSocket默认会自动读取这类参数走SOCKS代理,不需要修改任何代码:

-DsocksProxyHost=你的代理主机地址
-DsocksProxyPort=你的代理端口
-DsocksProxyVersion=5
# 如果代理需要认证,额外添加以下两个参数
-Djava.net.socks.username=代理用户名
-Djava.net.socks.password=代理密码

场景2:只有HTTP/HTTPS代理可用

原生Socket/SSLSocket本身不支持自动走HTTP代理的CONNECT隧道,这种情况不修改代码无法直接通过系统参数配置生效,你需要先把HTTP代理转换为本地SOCKS代理,再按上述SOCKS代理的参数配置即可。

代理生效校验方法

方法1:开启Java网络调试日志

在JAVA_TOOL_OPTIONS中添加调试参数:
-Djava.net.debug=proxy,socket
运行程序后查看控制台输出:如果能看到SOCKS代理连接相关的日志,会明确显示正在使用的代理主机和端口,说明代理已生效;如果日志显示直接连接目标服务地址,说明代理没有生效。

方法2:网络抓包验证

使用Wireshark、tcpdump等抓包工具抓取程序运行时的流量:

  • 代理生效时,程序发起的第一个TCP握手请求的目标地址是代理的IP和端口,不是你要访问的目标服务的地址
  • 代理未生效时,TCP握手请求直接发往目标服务的IP和端口

内容的提问来源于stack exchange,提问作者1Z10

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 01:09:04