- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
从 HttpClient 4.3 开始,我一直在使用 HttpClientBuilder。我正在连接到具有基本身份验证的 REST 服务。我按如下方式设置凭据:
HttpClientBuilder builder = HttpClientBuilder.create();
// Get the client credentials
String username = Config.get(Constants.CONFIG_USERNAME);
String password = Config.get(Constants.CONFIG_PASSWORD);
// If username and password was found, inject the credentials
if (username != null && password != null)
{
CredentialsProvider provider = new BasicCredentialsProvider();
// Create the authentication scope
AuthScope scope = new AuthScope(AuthScope.ANY_HOST, AuthScope.ANY_PORT, AuthScope.ANY_REALM);
// Create credential pair
UsernamePasswordCredentials credentials = new UsernamePasswordCredentials(username, password);
// Inject the credentials
provider.setCredentials(scope, credentials);
// Set the default credentials provider
builder.setDefaultCredentialsProvider(provider);
}
但是,这不起作用(我正在使用的 REST 服务返回 401)。出了什么问题?
最佳答案
来自此处的抢先身份验证文档:
http://hc.apache.org/httpcomponents-client-ga/tutorial/html/authentication.html
默认情况下,httpclient 不会抢先提供凭据,它会先创建一个不带身份验证参数的 HTTP 请求。这是设计使然,作为安全预防措施,也是规范的一部分。但是,如果您不重试连接,或者您连接到的任何地方都希望您在第一次连接时发送身份验证详细信息,这会导致问题。它还会导致请求出现额外延迟,因为您需要进行多次调用,并导致 401 出现在日志中。
解决方法是使用身份验证缓存假装您已经连接到服务器一次。这意味着您只会进行一次 HTTP 调用,并且不会在日志中看到 401:
CloseableHttpClient httpclient = HttpClientBuilder.create().build();
HttpHost targetHost = new HttpHost("localhost", 80, "http");
CredentialsProvider credsProvider = new BasicCredentialsProvider();
credsProvider.setCredentials(
new AuthScope(targetHost.getHostName(), targetHost.getPort()),
new UsernamePasswordCredentials("username", "password"));
// Create AuthCache instance
AuthCache authCache = new BasicAuthCache();
// Generate BASIC scheme object and add it to the local auth cache
BasicScheme basicAuth = new BasicScheme();
authCache.put(targetHost, basicAuth);
// Add AuthCache to the execution context
HttpClientContext context = HttpClientContext.create();
context.setCredentialsProvider(credsProvider);
context.setAuthCache(authCache);
HttpGet httpget = new HttpGet("/");
for (int i = 0; i < 3; i++) {
CloseableHttpResponse response = httpclient.execute(
targetHost, httpget, context);
try {
HttpEntity entity = response.getEntity();
} finally {
response.close();
}
}
请注意:您需要信任要连接的主机,如果您使用的是 HTTP,您的用户名和密码将以明文形式发送(好吧,base64,但这不算数)。
您还应该使用更具体的 Authscope,而不是像示例中那样依赖 AuthScope.ANY_HOST
和 AuthScope.ANY_PORT
。
关于java - HttpClientBuilder 基本认证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20914311/
我正在尝试为 http post 实现编写单元测试。但是我无法正确模拟 httpclient 并且我的 when 语句永远不会被触发。我编写的单元测试是进行实际的 http 调用,而不是使用模拟响应进
从 HttpClient 4.3 开始,我一直在使用 HttpClientBuilder。我正在连接到具有基本身份验证的 REST 服务。我按如下方式设置凭据: HttpClientBuilder b
尝试使用 HttpClientBuilder 构建 Apache HttpClient 实例时出现 IllegalArgumentException: private CloseableHttpCli
Apache 已弃用 DefaultHttpClient,但 Android 似乎并非如此,另请参见此处 Deprecated Java HttpClient - How hard can it be
我在 android studio 上遇到了一个奇怪的问题。我正在使用 apache 库来发出一些 http 请求,我需要更改 org.apache.http.impl.client.DefaultH
HttpClient httpClient = HttpClientBuilder.create().setSSLSocketFactory(socketFactory).build(); 无法解析
我试图用这行代码创建一个 httpClient 实例: HttpClient httpClient = HttpClientBuilder.create().build(); 编译没问题,但是当代码执
我有一个 httpClientBuilder 实例, 我想将 CoreProtocolPNames.PROTOCOL_VERSION 设置为 HttpVersion.HTTP_1_1。 我应该如何使用
老程序员,Java新手。我正在尝试运行我认为非常常见的示例代码,该代码在网络上的许多地方都很相似,HttpClient httpClient = HttpClientBuilder.create().
这是我创建 HttpClient 的方法: private String userAgent= "Non empty user agent"; private HttpClient httpClien
我有一个使用 HttpClient 执行 HTTP 请求的 Maven Java 项目。在我本地的 Java Web 服务器上,一切正常。但是在我将其部署到 SAP Hana Cloud Platfo
我正在尝试为使用 HttpClientBuilder 发出的请求设置代理,如下所示: CredentialsProvider credsProvider = new BasicCred
以下是创建Httpclient的代码。 client = HttpClients.custom().setConnectionManager(connManag
在下面的 java 代码中,我随机收到以下错误。 final HttpClient client = HttpClientBuilder.create().build(); fin
我有一个在 Vanilla Spring 4.2.5.RELEASE 和 JDK 1.7 上运行的项目,它使用 RestTemplate 和 PoolingHttpClientConnectionMa
我正在使用HttpClient并且我使用httpCore.jar但我仍然面临异常 java.lang.ClassNotFoundException: org.apache.http.config.Lo
当我调用此代码时: HttpClientBuilder clientBuilder = HttpClientBuilder.create(); LaxRedirectStrategy laxStrat
我尝试从 servlet 中的静态函数向远程服务器发送请求,我使用 org.apache.http.client.HttpClient; 但是当我调试时,它总是停留在创建 HttpClient 上。
我正在尝试创建 HTTPClient 以使用 Java 中的 Apache HTTPClient 为 REST web 服务构建框架。 在这里我发现我们可以使用以下两种方式创建客户端。我想知道它们之间
在这里,我尝试在 selenium webdriver 中执行断开的链接场景,而我的 Java IDE 在“HttpClientBuilder()”上抛出错误 这是我的代码: public stati
我是一名优秀的程序员,十分优秀!