import java.io.IOException;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.net.SocketAddress;
import java.net.UnknownHostException;
import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import javax.net.SocketFactory;
import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
import org.apache.commons.httpclient.ConnectTimeoutException;
import org.apache.commons.httpclient.params.HttpConnectionParams;
import org.apache.commons.httpclient.protocol.ProtocolSocketFactory;
public class MySSLProtocolSocketFactory implements ProtocolSocketFactory {
private SSLContext sslcontext = null;
private SSLContext createSSLContext() {
SSLContext sslcontext=null;
try {
sslcontext = SSLContext.getInstance("SSL");
//在HTTPS的证书未经权威机构认证的情况下,访问HTTPS站点;自己实现并覆盖JSSE缺省的证书信任管理器类
sslcontext.init(null, new TrustManager[]{new TrustAnyTrustManager()}, new java.security.SecureRandom());
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (KeyManagementException e) {
e.printStackTrace();
}
return sslcontext;
}
private SSLContext getSSLContext() {
if (this.sslcontext == null) {
this.sslcontext = createSSLContext();
}
return this.sslcontext;
}
public Socket createSocket(Socket socket, String host, int port, boolean autoClose)
throws IOException, UnknownHostException {
return getSSLContext().getSocketFactory().createSocket(
socket,
host,
port,
autoClose
);
}
public Socket createSocket(String host, int port) throws IOException,
UnknownHostException {
return getSSLContext().getSocketFactory().createSocket(
host,
port
);
}
public Socket createSocket(String host, int port, InetAddress clientHost, int clientPort)
throws IOException, UnknownHostException {
return getSSLContext().getSocketFactory().createSocket(host, port, clientHost, clientPort);
}
public Socket createSocket(String host, int port, InetAddress localAddress,
int localPort, HttpConnectionParams params) throws IOException,
UnknownHostException, ConnectTimeoutException {
if (params == null) {
throw new IllegalArgumentException("Parameters may not be null");
}
int timeout = params.getConnectionTimeout();
SocketFactory socketfactory = getSSLContext().getSocketFactory();
if (timeout == 0) {
return socketfactory.createSocket(host, port, localAddress, localPort);
} else {
Socket socket = socketfactory.createSocket();
SocketAddress localaddr = new InetSocketAddress(localAddress, localPort);
SocketAddress remoteaddr = new InetSocketAddress(host, port);
socket.bind(localaddr);
socket.connect(remoteaddr, timeout);
return socket;
}
}
//自定义私有类
private static class TrustAnyTrustManager implements X509TrustManager {
//该方法检查客户端的证书,若不信任该证书则抛出异常。由于我们不需要对客户端进行认证,因此我们只需要执行默认的信任管理器的这个方法。
public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
}
//该方法检查服务器的证书,若不信任该证书同样抛出异常。通过自己实现该方法,可以使之信任我们指定的任何证书。在实现该方法时,也可以简单的不做任何处理,即一个空的函数体,由于不会抛出异常,它就会信任任何证书。
public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
}
//返回受信任的X509证书数组。
public X509Certificate[] getAcceptedIssuers() {
return new X509Certificate[]{};
}
}
}
/**
* 调用httpClient3.1 的方法
*
* @param data
* @param httpClient
* @return
*/
private static String httpRequest(String data, HttpClient httpClient) {
///////////////////优化配置参数
HttpConnectionManagerParams params =new HttpConnectionManagerParams();
//请求超时4秒钟 按照实际业务需求设置
params.setConnectionTimeout(4000);
//等待超市 按照实际业务需求设置
params.setSoTimeout(4000);
// 最大连接数
params.setMaxTotalConnections(500);
params.setDefaultMaxConnectionsPerHost(500);
params.setStaleCheckingEnabled(true);
HttpConnectionManager httpConnectionManager = new MultiThreadedHttpConnectionManager();
httpConnectionManager.setParams(params);
HttpClientParams httpClientParams = new HttpClientParams();
// 设置httpClient的连接超时,对连接管理器设置的连接超时是无用的
httpClientParams.setConnectionManagerTimeout(5000);
httpClient.setHttpConnectionManager(httpConnectionManager);
httpClient.setParams(httpClientParams);
///////////////////优化配置参数 end
Protocol myhttps = new Protocol("https", new MySSLProtocolSocketFactory(), port);
Protocol.registerProtocol("https", myhttps);
PostMethod postMethod = new PostMethod(httpsURL);
//设置请求报文的字符集
postMethod.addRequestHeader("Content-Type", "text/html;charset=GBK");
String respones = null;
postMethod.setRequestBody(data);
// 执行postMethod
try {
int statusCode = httpClient.executeMethod(postMethod);
// HttpClient对于要求接受后继服务的请求,象POST和PUT等不能自动处理转发
// 301或者302
if (statusCode == HttpStatus.SC_MOVED_PERMANENTLY || statusCode == HttpStatus.SC_MOVED_TEMPORARILY) {
// 从头中取出转向的地址
Header locationHeader = postMethod.getResponseHeader("location");
String location = null;
if (locationHeader != null) {
location = locationHeader.getValue();
loggerBoce.info("The page was redirected to:" + location);
} else {
loggerBoce.info("Location field value is null.");
}
}
respones = postMethod.getResponseBodyAsString();
} catch (HttpException e) {
loggerBoce.error(e.getMessage(), e);
} catch (IOException e) {
// 发生网络异常
loggerBoce.error(e.getMessage(), e);
} catch (Exception e) {
loggerBoce.error(e.getMessage(), e);
}finally{
//释放连接
if(null != postMethod){
postMethod.releaseConnection();
}
}
return respones;
}
相关推荐
此外,HttpClient3.1 还支持HTTPS连接,只需更改URL为以`https:`开头,HttpClient会自动处理SSL/TLS握手,确保安全的加密通信。如果你需要自定义SSL配置,可以通过`SSLContext`和`SchemeRegistry`来实现。 为了更好...
HttpClient 3.1 是一个广泛使用的Java库,用于执行HTTP和HTTPS请求。它是由Apache软件基金会开发的,作为HTTP协议的客户端实现。这个jar包在处理网络通信,尤其是在需要复杂HTTP操作,如重试、连接池管理和身份验证...
HttpClient3.1.jar是Apache软件基金会的一个...然而,需要注意的是,HttpClient3.1已较为陈旧,后续的版本如HttpClient 4.x引入了更多的改进和优化,因此在新的项目中,建议使用更新的版本以获得更好的性能和兼容性。
这使得HttpClient能够安全地访问需要身份验证的资源。 另外,HttpClient还提供了对Cookie的管理。通过`CookiePolicy`和`CookieSpec`,我们可以控制Cookie的接收和发送策略,确保合规性。 在使用过程中,我们还需要...
《Apache Commons HttpClient 3.1:HTTP客户端编程的基石》 ...然而,需要注意的是,HttpClient 3.1已不再维护,最新的稳定版本为HttpClient 4.x,对于新项目建议使用更现代的版本以获取更好的性能和兼容性。
在使用这个jar包时,可以通过阅读官方文档、参考示例代码或者访问标签中提到的"脚本之家"等资源网站来获取更多帮助。例如,`去脚本之家看看.url`可能是指向一个教程或论坛的链接,那里可能有详细的使用指南和常见...
《Apache Commons HttpClient 3.1详解》 Apache Commons HttpClient 是一个功能强大的Java库,用于执行HTTP客户端请求。这个库在3.1版本中提供了一系列高级HTTP功能,使得开发者能够更轻松地处理网络通信,尤其在...
根据提供的文件信息,我们可以深入探讨如何使用`httpclient`库来进行`https`访问,并了解其中涉及的关键概念和技术细节。 ### 标题与描述解析:使用`httpclient`进行`https`访问 #### 1. `httpclient`简介 `...
标题中的“使用httpClient访问https+443端口号”指的是使用Apache HttpClient库来发起HTTPS(安全超文本传输协议)请求,目标服务器的默认端口是443。HTTPS是一种基于SSL/TLS的安全通信协议,用于在客户端和服务器...
标题和描述中提到的“国产化之银河麒麟.netcore3.1 访问 https 服务的两个问题”主要涉及在银河麒麟操作系统上使用 .NET Core 3.1 进行 HTTPS 通信时遇到的挑战。这两个问题分别是: 1. **无法验证证书的由颁发者...
HttpClient是个很不错的开源框架(org.appache.http),封装了访问http的请求头,参数,内容体,响应等等,使用起来更方面更强大。 HttpURLConnection是java的标准类,可以实现简单的基于URL请求、响应功能,什么都...
用java代码实现访问后台接口数据,传输的是json,为实现这一功能所用的jar包 一共有11个jar包 httpclient-4.5.12.jar httpcore-4.4.13.jar为较新的版本 commons-beanutils-1.7.0.jar commons-collections-3.1.jar ...
HttpClient 3.1需要依赖commons-httpclient-3.1.jar、commons-logging.jar和commons-codec.jar这些jar包,而HttpClient 4.x的最新版本为4.1.2,官方不再维护3.x版本。HttpClient 4.x的jar包可以在Apache官方网站上...
1. Commons-HTTPClient的主库文件:commons-httpclient-3.1.jar,可以从Apache官方网站获取。 2. Commons-codec库文件:commons-codec-1.x.jar,因为HttpClient依赖于它来处理编码解码,可以从Apache Jakarta common...
- **1.2.1 HttpClient线程安全性**: `HttpClient`实例本身不是线程安全的,但在正确配置下,可以支持多线程并发访问。 - **1.2.2 HttpClient资源释放**: 使用完`HttpClient`后,应该调用其提供的方法来释放资源,...
本文将深入探讨`httpclient jar`,它是Apache HttpClient库的实现,支持HTTP和HTTPS协议,提供POST和GET等操作。 一、HttpClient简介 HttpClient是Apache软件基金会的一个开源项目,其主要目标是为Java开发者提供...
此外,HttpClient还提供了处理HTTPS请求的能力,这对于爬取使用HTTPS协议的网站非常有用。通过设置SSLContext和SecureProtocolSocketFactory,可以实现对HTTPS的安全访问。 在实际使用中,HttpClient可能会遇到各种...
##### 3.1 Get方式 Get方法通常用于从服务器获取资源。在Web API中,Get方法可以有多个重载版本,每个版本可以接受不同的参数组合。这些参数通常出现在URL中,作为查询字符串的一部分。 示例: ```csharp public ...
Java抓取https网页数据,解决peer not authenticated异常。导入eclipse就能运行,带有所用的jar包(commons-httpclient-3.1.jar,commons-logging.jar,httpclient-4.2.5.jar,httpcore-4.2.4.jar)