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

Spring Boot应用配置Squidmen代理后HttpURLConnection请求未通过代理路由的解决方法咨询

解决Spring Boot中HttpURLConnection请求未通过代理路由的问题

首先,我注意到你用curl测试代理是正常的,但Java代码里的HttpURLConnection没走代理,核心原因是Java的HttpURLConnection默认读取的是JVM系统属性,而非直接读取操作系统的环境变量,而你设置的那些环境变量并没有自动映射成JVM系统属性。下面给你几个可行的解决方案:

方案一:启动Spring Boot时指定JVM代理参数

直接在启动应用时添加JVM参数,这样HttpURLConnection会自动识别并使用这些配置:

java -Dhttp.proxyHost=127.0.0.1 -Dhttp.proxyPort=3333 -Dhttps.proxyHost=127.0.0.1 -Dhttps.proxyPort=3333 -jar your-spring-boot-app.jar

如果是用IDE启动,可以在Run Configuration的VM options中添加上述参数。

方案二:在代码中显式配置代理

如果你需要在代码层面灵活控制代理规则,可以直接给HttpURLConnection绑定Proxy对象,确保请求强制走代理:

URL url = new URL("https://google.com");
// 创建指定代理的对象
Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("127.0.0.1", 3333));
HttpURLConnection con = (HttpURLConnection) url.openConnection(proxy);
con.setRequestMethod("GET");
System.out.println(con.getResponseCode());
System.out.println(con.getHeaderField("Content-Type"));

这种方式最直接,能精准控制单个请求的代理行为。

方案三:将环境变量映射为JVM系统属性

如果你想保留通过环境变量配置的方式,可以在Spring Boot启动时手动把环境变量同步到JVM系统属性中。比如在应用主类的main方法里添加:

public static void main(String[] args) {
    // 读取环境变量并设置为JVM系统属性
    System.setProperty("http.proxyHost", System.getenv("http.proxyHost"));
    System.setProperty("http.proxyPort", System.getenv("http.proxyPort"));
    System.setProperty("https.proxyHost", System.getenv("https.proxyHost"));
    System.setProperty("https.proxyPort", System.getenv("https.proxyPort"));
    SpringApplication.run(YourApplication.class, args);
}

这样后续所有的HttpURLConnection请求都会自动继承代理配置。

额外注意事项

  • 若涉及HTTPS请求,确保Squid代理已开启HTTPS转发支持(默认配置通常已支持,可检查Squid的配置文件确认)。
  • 如果有内网地址不需要走代理,可以通过http.nonProxyHosts系统属性指定,例如:-Dhttp.nonProxyHosts=localhost|192.168.*

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 10:02:39