AEM 中的 HttpClient 问题

Issue with HttpClient in AEM

我编写了一个来自 org.apache.commons.httpclient 包的 HttpClient 代码。

因为我是这样设置连接时间和套接字超时的。

final HttpClient http = new HttpClient(this.connectionManager);

http.getParams().setParameter("http.connection.timeout", this.connectionTimeout);
http.getParams().setParameter("http.socket.timeout", this.socketTimeout);

现在 Adob​​e Cloud 提出了未设置超时的问题(这不是真的)。 他们建议使用

设置超时
@Reference
private HttpClientBuilderFactory httpClientBuilderFactory;

public void doThis() {
  HttpClientBuilder builder = httpClientBuilderFactory.newBuilder();
  RequestConfig requestConfig = RequestConfig.custom()
    .setConnectTimeout(5000)
    .setSocketTimeout(5000)
    .build();
  builder.setDefaultRequestConfig(requestConfig);

  HttpClient httpClient = builder.build();

  // do something with the client
}

参考Link

但是HttpClientBuilderFactory不属于**org.apache.commons.httpclient它属于org.apache.http.client**

并且总是 returns 可关闭的 Http 客户端。

如何解决此安全问题?我可以为异常添加注释吗?还是我必须重写所有代码?

此问题与 Adob​​e Experience Manager 6.5 实例有关。

可能是因为你没有设置正确的超时参数?

您设置的 属性 http.connection.timeout 在 class org.apache.commons.httpclient.params.HttpClientParams 中不可用。

http.getParams() returns HttpClientParams 的一个实例,它有套接字超时和连接管理器超时,但没有连接超时。您可能会使用常量 HttpClientParams.CONNECTION_MANAGER_TIMEOUT 为连接管理器设置超时?

另一方面,属性 http.connection.timeout 可用于 class HttpConnectionParams

Constant field values reference

问题是 Adob​​e 有两个版本的 HttpClient,旧的 3.x 具有包结构 org.apache.commons.httpclient.HttpClient 和 HttpClientBuilderFactory 给出的 4.x org.apache.http.Httpclient。

我为此伤透了脑筋。最后我们有两个选择...

1) 将我们所有的公共 http api(3.x) 重写为更新版本的 apache.http (4.x) 具有方法 setTimeout 和 setConnectionTimeout

2)@SuppressWarnings("CQRules:ConnectionTimeoutMechanism")

我们选择了选项 2,因为这方面的工作量很大,我们计划很快上线。