使用 Java 以编程方式设置全局 HTTP(S) 代理

简介: 【8月更文挑战第18天】

在企业级应用开发中,尤其是涉及网络请求的应用程序,设置代理服务器是一个常见的需求。代理服务器可以帮助绕过防火墙、进行负载均衡、缓存内容以及隐藏用户的真实 IP 地址。Java 作为一种跨平台编程语言,提供了多种方式来设置 HTTP(S) 代理。本文将详细介绍如何在 Java 中以编程方式设置全局 HTTP 和 HTTPS 代理。

一、通过系统属性设置代理

Java 提供了一种简单的方式,通过设置系统属性来指定 HTTP 和 HTTPS 代理。以下是具体的代码示例:

public class ProxySetup {
   
   
    public static void main(String[] args) {
   
   
        // 设置HTTP代理
        System.setProperty("http.proxyHost", "proxy.example.com");
        System.setProperty("http.proxyPort", "8080");

        // 设置HTTPS代理
        System.setProperty("https.proxyHost", "proxy.example.com");
        System.setProperty("https.proxyPort", "443");

        // 如果需要用户名和密码
        System.setProperty("http.proxyUser", "username");
        System.setProperty("http.proxyPassword", "password");

        // 测试代理设置
        try {
   
   
            URL url = new URL("http://www.example.com");
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
            String inputLine;
            while ((inputLine = in.readLine()) != null) {
   
   
                System.out.println(inputLine);
            }
            in.close();
        } catch (IOException e) {
   
   
            e.printStackTrace();
        }
    }
}

在这个例子中,System.setProperty 方法被用来设置代理的主机名和端口号。HTTP 代理和 HTTPS 代理可以分别通过 http.proxyHosthttps.proxyHost 来设置。对应的端口号可以通过 http.proxyPorthttps.proxyPort 来设置。

如果代理服务器需要身份验证,可以通过设置 http.proxyUserhttp.proxyPassword 来提供用户名和密码。不过需要注意的是,这种方式存在一定的安全风险,因为用户名和密码以明文形式存在代码中。

二、通过 Proxy 类设置代理

除了通过系统属性设置代理,Java 还提供了更为灵活的 Proxy 类来以编程方式设置代理。这种方式更适合需要在应用程序运行时动态更改代理设置的场景。

以下是使用 Proxy 类设置 HTTP 代理的代码示例:

import java.net.*;

public class ProxyExample {
   
   
    public static void main(String[] args) {
   
   
        try {
   
   
            // 创建代理对象
            Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("proxy.example.com", 8080));

            // 打开连接并使用代理
            URL url = new URL("http://www.example.com");
            HttpURLConnection connection = (HttpURLConnection) url.openConnection(proxy);

            // 读取响应
            BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
            String inputLine;
            while ((inputLine = in.readLine()) != null) {
   
   
                System.out.println(inputLine);
            }
            in.close();
        } catch (IOException e) {
   
   
            e.printStackTrace();
        }
    }
}

在这个例子中,我们首先创建了一个 Proxy 对象,并指定了代理的类型和地址。然后在打开连接时,将 Proxy 对象作为参数传递给 openConnection 方法。这种方式比通过系统属性设置代理更加灵活,因为它允许为每个连接指定不同的代理设置。

三、设置身份验证的代理

对于需要身份验证的代理服务器,Java 提供了 Authenticator 类来管理代理的身份验证。下面的示例展示了如何使用 Authenticator 类来处理代理的用户名和密码:

import java.net.*;
import java.io.*;

public class ProxyAuthenticatorExample {
   
   
    public static void main(String[] args) {
   
   
        // 设置默认的 Authenticator
        Authenticator.setDefault(new Authenticator() {
   
   
            @Override
            protected PasswordAuthentication getPasswordAuthentication() {
   
   
                if (getRequestorType() == RequestorType.PROXY) {
   
   
                    return new PasswordAuthentication("username", "password".toCharArray());
                }
                return null;
            }
        });

        // 设置代理
        System.setProperty("http.proxyHost", "proxy.example.com");
        System.setProperty("http.proxyPort", "8080");

        // 测试代理设置
        try {
   
   
            URL url = new URL("http://www.example.com");
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
            String inputLine;
            while ((inputLine = in.readLine()) != null) {
   
   
                System.out.println(inputLine);
            }
            in.close();
        } catch (IOException e) {
   
   
            e.printStackTrace();
        }
    }
}

在这个示例中,我们通过 Authenticator.setDefault 方法设置了一个全局的 Authenticator。该 Authenticator 会在需要身份验证时自动提供用户名和密码。getPasswordAuthentication 方法会在 Java 需要身份验证时被调用,返回一个包含用户名和密码的 PasswordAuthentication 对象。

四、总结

在 Java 中以编程方式设置全局 HTTP(S) 代理有多种方法可以实现。通过系统属性设置代理是一种简单直接的方式,适用于应用程序启动时就确定代理配置的场景。使用 Proxy 类和 Authenticator 类则提供了更大的灵活性,适合在应用程序运行过程中动态管理代理配置。

无论使用哪种方法,确保安全性和正确性都是至关重要的,尤其是在处理涉及敏感信息(如用户名和密码)的情况下。了解并熟练掌握这些技术,可以帮助开发者在不同的网络环境中实现更加稳定和可靠的 Java 应用程序。

目录
相关文章
|
1月前
|
Java 数据库连接 API
2025 更新必看:Java 编程基础入门级超级完整版指南
本教程为2025更新版Java编程基础入门指南,涵盖开发环境搭建(SDKMAN!管理JDK、VS Code配置)、Java 17+新特性(文本块、Switch表达式增强、Record类)、面向对象编程(接口默认方法、抽象类与模板方法)、集合框架深度应用(Stream API高级操作、并发集合)、模式匹配与密封类等。还包括学生成绩管理系统实战项目,涉及Maven构建、Lombok简化代码、JDBC数据库操作及JavaFX界面开发。同时提供JUnit测试、日志框架使用技巧及进阶学习资源推荐,助你掌握Java核心技术并迈向高级开发。
134 5
|
1月前
|
Oracle Java 关系型数据库
java 编程基础入门级超级完整版教程详解
这份文档是针对Java编程入门学习者的超级完整版教程,涵盖了从环境搭建到实际项目应用的全方位内容。首先介绍了Java的基本概念与开发环境配置方法,随后深入讲解了基础语法、控制流程、面向对象编程的核心思想,并配以具体代码示例。接着探讨了常用类库与API的应用,如字符串操作、集合框架及文件处理等。最后通过一个学生成绩管理系统的实例,帮助读者将理论知识应用于实践。此外,还提供了进阶学习建议,引导学员逐步掌握更复杂的Java技术。适合初学者系统性学习Java编程。资源地址:[点击访问](https://pan.quark.cn/s/14fcf913bae6)。
125 2
|
23天前
|
缓存 安全 算法
2025 年 Java 秋招面试必看 Java 并发编程面试题实操篇
Java并发编程是Java技术栈中非常重要的一部分,也是面试中的高频考点。本文从基础概念、关键机制、工具类、高级技术等多个方面进行了介绍,并提供了丰富的实操示例。希望通过本文的学习,你能够掌握Java并发编程的核心知识,在面试中取得好成绩。同时,在实际工作中,也能够运用这些知识设计和实现高效、稳定的并发系统。
38 0
|
23天前
|
存储 安全 Java
2025 年 Java 秋招面试必看的 Java 并发编程面试题汇总
文章摘要: 本文系统梳理Java并发编程核心知识点,助力2025年秋招面试。内容涵盖:1)基础概念,包括线程/进程区别、创建线程的3种方式(Thread/Runnable/Callable)、6种线程状态及转换;2)关键机制,对比sleep()与wait()的锁行为差异,解释start()而非run()启动线程的原因;3)工具类与典型应用场景。通过技术原理与代码示例结合的方式,帮助开发者深入理解并发模型、线程同步等核心问题,为高并发系统设计打下坚实基础。(150字)
62 0
|
Web App开发
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html><head><meta http-equiv="Cont
TCP洪水攻击(SYN Flood)的诊断和处理 Posted by  海涛  on 2013 年 7 月 11 日 Tweet1 ​1. SYN Flood介绍 前段时间网站被攻击多次,其中最猛烈的就是TCP洪水攻击,即SYN Flood。
1083 0
|
存储 Web App开发 监控
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html><head><meta http-equiv="Cont
我们以前使用过的对hbase和hdfs进行健康检查,及剩余hdfs容量告警,简单易用 1.针对hadoop2的脚本: #/bin/bashbin=`dirname $0`bin=`cd $bin;pwd`STATE_OK=...
1092 0
|
SQL Web App开发 前端开发
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html><head><meta http-equiv="Cont
在运行一个group by的sql时,抛出以下错误信息: Task with the most failures(4):  -----Task ID:  task_201411191723_723592_m_000004URL:  http://DDS0204.
1051 0
|
Web App开发 存储 前端开发
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html><head><meta http-equiv="Cont
      前段时间公司hadoop集群宕机,发现是namenode磁盘满了, 清理出部分空间后,重启集群时,重启失败。 又发现集群Secondary namenode 服务也恰恰坏掉,导致所有的操作log持续写入edits.new 文件,等集群宕机的时候文件大小已经达到了丧心病狂的70G+..重启集群报错 加载edits文件失败。
1007 0

热门文章

最新文章