配置 HTTP 代理 - Amazon SDK for Java 2.x
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

配置 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_PROXY 1

采用 HTTP 架构的有效网址

全部

HTTPS_PROXY 1

采用 HTTPS 架构的有效网址

Netty、CRT

NO_PROXY 2

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

全部

全部-SDK 提供的所有 HTTP 客户端— UrlConnectionHttpClient ApacheHttpClient、、NettyNioAsyncHttpClientAwsCrtAsyncHttpClient

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

CRT- Amazon 基于 CRT 的 HTTP 客户端,(AwsCrtHttpClient和)。AwsCrtAsyncHttpClient

1 查询的环境变量(HTTP_PROXY是否HTTPS_PROXY为)取决于客户端中的方案设置。ProxyConfiguration默认方案是 HTTP。以下代码段显示了如何将用于环境变量解析的方案更改为 HTTPS。

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

2 NO_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生成器都提供名为useSystemPropertyValues和的设置useEnvironmentVariablesValues。默认情况下,这两个设置都是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