我正在嘗試使用 SSL 發出 HTTP 獲取請求以檢查與遠程服務器的連接是否正常,我在互聯網上找到了幾個示例,但沒有一個是完全決議的,似乎 java 不斷更改、棄用和洗掉舊的類和方法.
這是我可以獲得的最大決議代碼(有些行仍未決議):
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.security.KeyManagementException;
import java.security.KeyStore;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.UnrecoverableKeyException;
import java.security.cert.CertificateException;
import javax.net.ssl.SSLContext;
import org.apache.http.ssl.SSLContexts;
//import org.apache.http.conn.ssl.SSLContexts;
public class SSLContextLoader {
public static SSLContext initSSLContext () {
String clientKeyStorePath = ConfigManager.GetInstance().GetKeyStorePath();
String trustStorePath = ConfigManager.GetInstance().GetTrustStorePath();
String clientKeyStorePassword = ConfigManager.GetInstance().GetKeyStorePassword();
String trustStorePassword = ConfigManager.GetInstance().GetTrustStorePassword();
String keyPassword = clientKeyStorePassword;
try {
final KeyStore clientKeystore = KeyStore.getInstance("JKS");
clientKeystore.load(new FileInputStream(clientKeyStorePath), clientKeyStorePassword.toCharArray());
final KeyStore trustStore = KeyStore.getInstance("JKS");
trustStore.load(new FileInputStream(trustStorePath), trustStorePassword.toCharArray());
final SSLContext sslContext = SSLContexts.custom()
.loadTrustMaterial(trustStore, null)
.loadKeyMaterial(clientKeystore, keyPassword.toCharArray())
.build();
return sslContext;
} catch (KeyStoreException e) {
e.printStackTrace();
} catch (CertificateException e) {
e.printStackTrace();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (UnrecoverableKeyException e) {
e.printStackTrace();
} catch (KeyManagementException e) {
e.printStackTrace();
}
return null;
}
}
import java.io.IOException;
import java.net.URI;
import java.net.http.HttpRequest;
import javax.net.ssl.SSLContext;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpUriRequest;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.impl.client.HttpClients;
public class GetRequest {
private final static String ENDPOINT_URL = "https://www.google.com/";
public void sendSSLRequest() {
final SSLContext sslContext = SSLContextLoader.initSSLContext();
final HttpClientBuilder clientbuilder = HttpClients.custom().setSslcontext(sslContext);
final HttpClient client = clientbuilder.build();
//final HttpGet request = new HttpGet(ENDPOINT_URL);
// HttpClient httpClient = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://www.google.com/"))
.build();
//HttpResponse response = httpClient.send(request, HttpResponse.BodyHandlers.ofString()); // cannot find symbols httpClient and BodyHandlers
try {
// the following code needs a cast to (HttpUriRequest) to parse :
client.execute(request); // expecting (HttpUriRequest) and we have HttpRequest
} catch (final IOException e) {
//do some exception handling...
}
}
}
httpClient.send 未決議,因為未找到 httpClient。
還有 client.execute(request); 沒有決議,因為構建器回傳一個 HttpRequest 并且執行方法需要 HttpUriRequest 這是一個子類。
send 和 execute 是發送請求的兩種選擇(可能在不同版本的庫中作業)并且兩者都不決議。
這是我對 apache 庫的兩個 Maven 依賴項:
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.3.5</version>
<type>jar</type>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpcore</artifactId>
<version>4.4.8</version>
</dependency>
uj5u.com熱心網友回復:
您需要以不同的方式生成 HttpUriRequest 作為其介面,因此您必須使用其實作類來創建其物件并將其傳遞給 execute 方法。同樣
The method setSslcontext(SSLContext) from the type HttpClientBuilder is deprecated,您應該使用 SSLConnectionSocketFactory。
沒有代理
public void sendSSLRequest() {
final SSLContext sslContext = SSLContextLoader.initSSLContext();
final SSLConnectionSocketFactory csf = new SSLConnectionSocketFactory(sslContext);
final CloseableHttpClient client = HttpClients.custom().setSSLSocketFactory(csf).build();
HttpUriRequest request = new HttpGet(URI.create("https://www.google.com/"));
try {
client.execute(request);
} catch (final IOException e) {
// do some exception handling...
}
}
帶代理且不帶身份驗證
public void sendSSLRequest() {
HttpHost proxy = new HttpHost("ip address", 8080);
DefaultProxyRoutePlanner routePlanner = new DefaultProxyRoutePlanner(proxy);
final SSLContext sslContext = SSLContextLoader.initSSLContext();
final SSLConnectionSocketFactory csf = new SSLConnectionSocketFactory(sslContext);
final CloseableHttpClient client =
HttpClients.custom().setSSLSocketFactory(csf).setRoutePlanner(routePlanner).build();
HttpUriRequest request = new HttpGet(URI.create("https://www.google.com/"));
try {
client.execute(request);
} catch (final IOException e) {
// do some exception handling...
}
}
帶身份驗證的代理
public void sendSSLRequest() {
HttpHost proxy = new HttpHost("ip address", 8080);
DefaultProxyRoutePlanner routePlanner = new DefaultProxyRoutePlanner(proxy);
// Client credentials
CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
credentialsProvider.setCredentials(new AuthScope(proxy),
new UsernamePasswordCredentials("username_admin", "secret_password"));
// Create AuthCache instance
AuthCache authCache = new BasicAuthCache();
BasicScheme basicAuth = new BasicScheme();
authCache.put(proxy, basicAuth);
HttpClientContext context = HttpClientContext.create();
context.setCredentialsProvider(credentialsProvider);
context.setAuthCache(authCache);
final SSLContext sslContext = SSLContextLoader.initSSLContext();
final SSLConnectionSocketFactory csf = new SSLConnectionSocketFactory(sslContext);
final CloseableHttpClient client = HttpClients.custom().setSSLSocketFactory(csf).setRoutePlanner(routePlanner)
.setDefaultCredentialsProvider(credentialsProvider).build();
HttpUriRequest request = new HttpGet(URI.create("https://www.google.com/"));
try {
client.execute(request, context);
} catch (final IOException e) {
// do some exception handling...
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/511465.html
