配置 HTTP 代理 - AWS SDK for Java 2.x

配置 HTTP 代理

您可以通过使用代码、设置 Java 系统属性或设置环境变量来配置 HTTP 代理。

在代码中配置

在生成服务客户端时,您可以使用特定于客户端的 ProxyConfiguration 生成器在代码中配置代理。以下代码显示了 Amazon S3 服务客户端所用的基于 Apache 的 HTTP 客户端的示例代理配置。

SdkHttpClient httpClient1 = ApacheHttpClient.builder() .proxyConfiguration(ProxyConfiguration.builder() .endpoint(URI.create("http://proxy.example.com")) .username("username") .password("password") .addNonProxyHost("localhost") .build()) .build(); S3Client s3Client = S3Client.builder() .httpClient(httpClient) .build();

本主题中提及的每个 HTTP 客户端都在其详细介绍部分提供了一个代理配置示例。

使用外部设置配置 HTTP 代理

即使您没有在代码中明确使用 ProxyConfiguration 生成器,SDK 也会查找外部设置来配置默认代理配置。

默认情况下,SDK 先搜索 JVM 系统属性。即使只找到一个属性,SDK 也会使用该值和任何其他系统属性值。如果没有可用的系统属性,SDK 会查找代理环境变量。

SDK 可以使用以下 Java 系统属性和环境变量。

Java 系统属性
系统属性 描述 HTTP 客户端支持

http.proxyHost

HTTP 代理服务器主机名

全部

http.proxyPort

HTTP 代理服务器端口号

全部

http.proxyUser

HTTP 代理身份验证用户名

全部

http.proxyPassword

HTTP 代理身份验证密码

全部

http.nonProxyHosts

应绕过代理直接访问的主机列表。使用 HTTPS 时此列表也有效

全部

https.proxyHost

HTTPS 代理服务器主机名

Netty、CRT

https.proxyPort

HTTPS 代理服务器端口号

Netty、CRT

https.proxyUser

HTTPS 代理身份验证用户名

Netty、CRT
https.proxyPassword HTTPS 代理身份验证密码 Netty、CRT
环境变量
环境变量 描述 HTTP 客户端支持
HTTP_PROXY1

采用 HTTP 架构的有效 URL

全部

HTTPS_PROXY1

采用 HTTPS 架构的有效 URL

Netty、CRT

NO_PROXY2

应绕过代理直接访问的主机列表。该列表对 HTTP 和 HTTPS 均有效。

全部

全部 - SDK 提供全部 HTTP 客户端(UrlConnectionHttpClientApacheHttpClientNettyNioAsyncHttpClientAwsCrtAsyncHttpClient)。

Netty - 基于 Netty 的 HTTP 客户端(NettyNioAsyncHttpClient)。

CRT - 基于 AWS CRT 的 HTTP 客户端(AwsCrtHttpClientAwsCrtAsyncHttpClient)。

1查询的环境变量(HTTP_PROXYHTTPS_PROXY)取决于客户端的 ProxyConfiguration 中的架构设置。默认架构是 HTTP。以下代码段说明如何将用于环境变量解析的架构更改为 HTTPS。

SdkHttpClient httpClient = ApacheHttpClient.builder() .proxyConfiguration(ProxyConfiguration.builder() .scheme("https") .build()) .build();

2NO_PROXY 环境变量支持在主机名之间混用“|”和“,”分隔符。主机名可能包括“*”通配符。

使用多种设置的组合

您可以在代码、系统属性和环境变量中组合使用 HTTP 代理设置。

例 - 系统属性和代码提供的配置
// Command line with the proxy password set as a system property. $ java -Dhttp.proxyPassword=SYS_PROP_password -cp ... App // Since the 'useSystemPropertyValues' setting is 'true' (the default), the SDK will supplement // the proxy configuration in code with the 'http.proxyPassword' value from the system property. SdkHttpClient apacheHttpClient = ApacheHttpClient.builder() .proxyConfiguration(ProxyConfiguration.builder() .endpoint(URI.create("http://localhost:1234")) .username("username") .build()) .build(); // Use the apache HTTP client with proxy configuration. DynamoDbClient dynamoDbClient = DynamoDbClient.builder() .httpClient(apacheHttpClient) .build();

SDK 解析以下代理设置。

Host = localhost Port = 1234 Password = SYS_PROP_password UserName = username Non ProxyHost = null
例 - 系统属性和环境变量都可用

每个 HTTP 客户端的 ProxyConfiguration 生成器都提供名为 useSystemPropertyValuesuseEnvironmentVariablesValues 的设置。默认情况下,两个设置均为 true。当设置为 true 时,SDK 会自动将来自系统属性或环境变量的值用于 ProxyConfiguration 生成器未提供的选项。

重要

系统属性优先于环境变量。如果找到 HTTP 代理系统属性,SDK 将从系统属性中检索全部值,而不会从环境变量中检索任何值。如果要使环境变量优先于系统属性,请将 useSystemPropertyValues 设置为 false

在本示例中,以下设置在运行时可用:

// System properties http.proxyHost=SYS_PROP_HOST.com http.proxyPort=2222 http.password=SYS_PROP_PASSWORD http.user=SYS_PROP_USER // Environment variables HTTP_PROXY="http://EnvironmentUser:EnvironmentPassword@ENV_VAR_HOST:3333" NO_PROXY="environmentnonproxy.host,environmentnonproxy2.host:1234"

使用以下语句之一创建服务客户端。这些语句都没有明确设置代理设置。

DynamoDbClient client = DynamoDbClient.create(); DynamoDbClient client = DynamoDbClient.builder().build(); DynamoDbClient client = DynamoDbClient.builder() .httpClient(ApacheHttpClient.builder() .proxyConfiguration(ProxyConfiguration.builder() .build()) .build()) .build();

SDK 解析以下代理设置:

Host = SYS_PROP_HOST.com Port = 2222 Password = SYS_PROP_PASSWORD UserName = SYS_PROP_USER Non ProxyHost = null

由于服务客户端具有默认代理设置,因此 SDK 会搜索系统属性,然后搜索环境变量。由于系统属性设置优先于环境变量,因此 SDK 仅使用系统属性。

如果将系统属性的使用更改为 false,如以下代码所示,则 SDK 仅解析环境变量。

DynamoDbClient client = DynamoDbClient.builder() .httpClient(ApacheHttpClient.builder() .proxyConfiguration(ProxyConfiguration.builder() .useSystemPropertyValues(Boolean.FALSE) .build()) .build()) .build();

使用 HTTP 解析的代理设置包括:

Host = ENV_VAR_HOST Port = 3333 Password = EnvironmentPassword UserName = EnvironmentUser Non ProxyHost = environmentnonproxy.host, environmentnonproxy2.host:1234