下面是详细的“JSP开发中Apache-HTTPClient用户验证的实例详解”的攻略:
什么是Apache-HttpClient?
Apache-HttpClient是一个基于Java的Http客户端库。它提供了通过Http协议访问Web资源的方式,同时支持访问Https资源。
用户验证的作用
通过用户验证,我们可以将访问Web资源的操作限制在特定用户范围内,只允许特定的用户进行访问,从而保证Web资源的安全性。
Apache-HttpClient用户验证的实现方式
在Apache-HttpClient中,用户验证可以通过如下几种方式进行实现:
- Basic Authentication:基于用户名和密码的简单认证方式。
- Digest Authentication:基于哈希算法的消息摘要认证方式。
- NTLM Authentication:基于微软NTLM认证方式。
Basic Authentication实现方式
基于用户名和密码的简单认证方式,通过在Http请求头中添加"Authorization"信息来携带用户的认证信息。
在Apache-HttpClient中,可以通过如下方式进行Basic Authentication实现:
import org.apache.http.auth.AuthScope;
import org.apache.http.auth.UsernamePasswordCredentials;
import org.apache.http.impl.client.BasicAuthCache;
import org.apache.http.impl.client.BasicAuthCache;
import org.apache.http.impl.client.BasicCredentialsProvider;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.HttpHost;
import org.apache.http.HttpResponse;
import org.apache.http.client.AuthCache;
import org.apache.http.client.CredentialsProvider;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.protocol.HttpClientContext;
HttpHost targetHost = new HttpHost("localhost", 8080, "http");
CredentialsProvider credsProvider = new BasicCredentialsProvider();
credsProvider.setCredentials(
new AuthScope(targetHost.getHostName(), targetHost.getPort()),
new UsernamePasswordCredentials("username", "password"));
CloseableHttpClient httpclient = HttpClients.custom()
.setDefaultCredentialsProvider(credsProvider)
.build();
AuthCache authCache = new BasicAuthCache();
authCache.put(targetHost, new BasicScheme());
// Create ClientContext and add it to the context
HttpClientContext context = HttpClientContext.create();
context.setCredentialsProvider(credsProvider);
context.setAuthCache(authCache);
HttpGet httpget = new HttpGet("/secure/");
HttpResponse response = httpclient.execute(targetHost, httpget, context);
上述代码中,我们首先创建了一个HttpHost
对象,指定要访问的Web资源的主机名和端口号,接着创建了CredentialsProvider
对象,将用户名和密码加入到该对象中。最后创建了CloseableHttpClient
对象并使用setDefaultCredentialsProvider()
函数将该对象与认证信息绑定,再使用HttpClients
工具类提供的custom()
函数进行创建。
在创建好CloseableHttpClient
对象后,我们还需实现AuthCache
对象,该对象为认证缓存对象,用来缓存认证信息,从而减少认证的次数。最后,我们创建了一个HttpClientContext
对象,并将之前创建的CredentialsProvider
对象和AuthCache
对象关联到该对象中。
我们接着创建了一个HttpGet
对象,用于表示要访问的Web资源的请求,并将之前创建的HttpClientContext
对象传递给execute()
函数执行请求。这样,在执行完请求后,所有的认证信息都将缓存在AuthCache
中,从而可以减少认证的次数。
Digest Authentication实现方式
基于哈希算法的消息摘要认证方式,通过在Http请求头中携带经过摘要算法处理的验证信息来实现的。
在Apache-HttpClient中,可以通过如下方式进行Digest Authentication实现:
import org.apache.http.auth.AuthScope;
import org.apache.http.auth.UsernamePasswordCredentials;
import org.apache.http.impl.client.BasicCredentialsProvider;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.client.CredentialsProvider;
import org.apache.http.client.methods.HttpGet;
CredentialsProvider credsProvider = new BasicCredentialsProvider();
credsProvider.setCredentials(AuthScope.ANY,
new UsernamePasswordCredentials("username", "password"));
CloseableHttpClient httpclient = HttpClients.custom()
.setDefaultCredentialsProvider(credsProvider)
.build();
HttpGet httpget = new HttpGet("http://localhost/");
System.out.println("Executing request " + httpget.getRequestLine());
CloseableHttpResponse response = httpclient.execute(httpget);
try {
HttpEntity entity = response.getEntity();
System.out.println("----------------------------------------");
System.out.println(response.getStatusLine());
EntityUtils.consume(entity);
} finally {
response.close();
}
上述代码中,我们首先创建了一个CredentialsProvider
对象,将用户名和密码加入到该对象中。接着创建了CloseableHttpClient
对象并使用setDefaultCredentialsProvider()
函数将该对象与认证信息绑定,再使用HttpClients
工具类提供的custom()
函数进行创建。
最后,我们创建了一个HttpGet
对象用于表示要访问的Web资源的请求,并执行该请求以获取响应结果。
NTLM Authentication实现方式
基于微软NTLM认证方式,主要利用域名、用户名和密码提供认证信息,与Windows操作系统内置的用户身份验证机制相同。
在Apache-HttpClient中,可以通过如下方式进行NTLM Authentication实现:
import org.apache.http.auth.AuthScope;
import org.apache.http.auth.NTCredentials;
import org.apache.http.impl.client.BasicCredentialsProvider;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.client.CredentialsProvider;
import org.apache.http.client.methods.HttpGet;
CredentialsProvider credsProvider = new BasicCredentialsProvider();
credsProvider.setCredentials(AuthScope.ANY,
new NTCredentials("user", "pwd", "workstation", "domain"));
CloseableHttpClient httpclient = HttpClients.custom()
.setDefaultCredentialsProvider(credsProvider)
.build();
HttpGet httpget = new HttpGet("http://localhost/");
System.out.println("Executing request " + httpget.getRequestLine());
CloseableHttpResponse response = httpclient.execute(httpget);
try {
HttpEntity entity = response.getEntity();
System.out.println("----------------------------------------");
System.out.println(response.getStatusLine());
EntityUtils.consume(entity);
} finally {
response.close();
}
上述代码中,我们首先创建了一个CredentialsProvider
对象,将用户名和密码加入到该对象中。接着创建了CloseableHttpClient
对象并使用setDefaultCredentialsProvider()
函数将该对象与认证信息绑定,再使用HttpClients
工具类提供的custom()
函数进行创建。
最后,我们创建了一个HttpGet
对象用于表示要访问的Web资源的请求,并执行该请求以获取响应结果。
两条实例说明:
- 假设我们的Web资源需要进行Basic Authentication认证,我们可以使用如下代码进行访问:
import org.apache.http.auth.AuthScope;
import org.apache.http.auth.UsernamePasswordCredentials;
import org.apache.http.impl.client.BasicCredentialsProvider;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.client.CredentialsProvider;
import org.apache.http.client.methods.HttpGet;
CredentialsProvider credsProvider = new BasicCredentialsProvider();
credsProvider.setCredentials(AuthScope.ANY,
new UsernamePasswordCredentials("username", "password"));
CloseableHttpClient httpclient = HttpClients.custom()
.setDefaultCredentialsProvider(credsProvider)
.build();
HttpGet httpget = new HttpGet("https://example.com/secure");
System.out.println("Executing request " + httpget.getRequestLine());
CloseableHttpResponse response = httpclient.execute(httpget);
try {
HttpEntity entity = response.getEntity();
System.out.println("----------------------------------------");
System.out.println(response.getStatusLine());
EntityUtils.consume(entity);
} finally {
response.close();
}
上述代码中,我们首先创建了一个BasicCredentialsProvider
对象,并将要使用的用户名和密码加入到该对象中。接着创建了一个CloseableHttpClient
对象,并将之前创建的BasicCredentialsProvider
对象与该对象绑定。
最后,我们创建了一个HttpGet
对象,用于表示要访问的Web资源的请求,并在执行该请求时,通过HttpClient执行Basic Authentication认证。
- 假设我们的Web资源需要进行Digest Authentication认证,我们可以使用如下代码进行访问:
import org.apache.http.auth.AuthScope;
import org.apache.http.auth.UsernamePasswordCredentials;
import org.apache.http.impl.client.BasicCredentialsProvider;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.client.CredentialsProvider;
import org.apache.http.client.methods.HttpGet;
CredentialsProvider credsProvider = new BasicCredentialsProvider();
credsProvider.setCredentials(AuthScope.ANY,
new UsernamePasswordCredentials("username", "password"));
CloseableHttpClient httpclient = HttpClients.custom()
.setDefaultCredentialsProvider(credsProvider)
.build();
HttpGet httpget = new HttpGet("https://example.com/secure");
System.out.println("Executing request " + httpget.getRequestLine());
CloseableHttpResponse response = httpclient.execute(httpget);
try {
HttpEntity entity = response.getEntity();
System.out.println("----------------------------------------");
System.out.println(response.getStatusLine());
EntityUtils.consume(entity);
} finally {
response.close();
}
上述代码中,我们首先创建了一个BasicCredentialsProvider
对象,并将要使用的用户名和密码加入到该对象中。接着创建了一个CloseableHttpClient
对象,并将之前创建的BasicCredentialsProvider
对象与该对象绑定。
最后,我们创建了一个HttpGet
对象,用于表示要访问的Web资源的请求,并在执行该请求时,通过HttpClient执行Digest Authentication认证。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JSP开发中Apache-HTTPClient 用户验证的实例详解 - Python技术站