`

httpclient3.1 访问https 地址的网站

    博客分类:
  • java
 
阅读更多

 

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 学习整理

    此外,HttpClient3.1 还支持HTTPS连接,只需更改URL为以`https:`开头,HttpClient会自动处理SSL/TLS握手,确保安全的加密通信。如果你需要自定义SSL配置,可以通过`SSLContext`和`SchemeRegistry`来实现。 为了更好...

    HttpClient 3.1 Jar包

    HttpClient 3.1 是一个广泛使用的Java库,用于执行HTTP和HTTPS请求。它是由Apache软件基金会开发的,作为HTTP协议的客户端实现。这个jar包在处理网络通信,尤其是在需要复杂HTTP操作,如重试、连接池管理和身份验证...

    HttpClient3.1.jar

    HttpClient3.1.jar是Apache软件基金会的一个...然而,需要注意的是,HttpClient3.1已较为陈旧,后续的版本如HttpClient 4.x引入了更多的改进和优化,因此在新的项目中,建议使用更新的版本以获得更好的性能和兼容性。

    commons-httpclient-3.1.jar

    这使得HttpClient能够安全地访问需要身份验证的资源。 另外,HttpClient还提供了对Cookie的管理。通过`CookiePolicy`和`CookieSpec`,我们可以控制Cookie的接收和发送策略,确保合规性。 在使用过程中,我们还需要...

    org.apache.commons.httpclient-3.1.jar

    《Apache Commons HttpClient 3.1:HTTP客户端编程的基石》 ...然而,需要注意的是,HttpClient 3.1已不再维护,最新的稳定版本为HttpClient 4.x,对于新项目建议使用更现代的版本以获取更好的性能和兼容性。

    commons-httpclient-3.1jar

    在使用这个jar包时,可以通过阅读官方文档、参考示例代码或者访问标签中提到的"脚本之家"等资源网站来获取更多帮助。例如,`去脚本之家看看.url`可能是指向一个教程或论坛的链接,那里可能有详细的使用指南和常见...

    commons-httpclient-3.1

    《Apache Commons HttpClient 3.1详解》 Apache Commons HttpClient 是一个功能强大的Java库,用于执行HTTP客户端请求。这个库在3.1版本中提供了一系列高级HTTP功能,使得开发者能够更轻松地处理网络通信,尤其在...

    httpclient来进行https访问

    根据提供的文件信息,我们可以深入探讨如何使用`httpclient`库来进行`https`访问,并了解其中涉及的关键概念和技术细节。 ### 标题与描述解析:使用`httpclient`进行`https`访问 #### 1. `httpclient`简介 `...

    使用httpClient访问https+443端口号。

    标题中的“使用httpClient访问https+443端口号”指的是使用Apache HttpClient库来发起HTTPS(安全超文本传输协议)请求,目标服务器的默认端口是443。HTTPS是一种基于SSL/TLS的安全通信协议,用于在客户端和服务器...

    国产化之银河麒麟.netcore3.1访问https服务的两个问题.doc

    标题和描述中提到的“国产化之银河麒麟.netcore3.1 访问 https 服务的两个问题”主要涉及在银河麒麟操作系统上使用 .NET Core 3.1 进行 HTTPS 通信时遇到的挑战。这两个问题分别是: 1. **无法验证证书的由颁发者...

    使用HttpClient下载图片

    HttpClient是个很不错的开源框架(org.appache.http),封装了访问http的请求头,参数,内容体,响应等等,使用起来更方面更强大。 HttpURLConnection是java的标准类,可以实现简单的基于URL请求、响应功能,什么都...

    httpclient jar包11个.rar

    用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学习总结.docx

    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官方网站上...

    HTTPClient组件的应用

    1. Commons-HTTPClient的主库文件:commons-httpclient-3.1.jar,可以从Apache官方网站获取。 2. Commons-codec库文件:commons-codec-1.x.jar,因为HttpClient依赖于它来处理编码解码,可以从Apache Jakarta common...

    httpClient使用指南最新版

    - **1.2.1 HttpClient线程安全性**: `HttpClient`实例本身不是线程安全的,但在正确配置下,可以支持多线程并发访问。 - **1.2.2 HttpClient资源释放**: 使用完`HttpClient`后,应该调用其提供的方法来释放资源,...

    httpclient jar

    本文将深入探讨`httpclient jar`,它是Apache HttpClient库的实现,支持HTTP和HTTPS协议,提供POST和GET等操作。 一、HttpClient简介 HttpClient是Apache软件基金会的一个开源项目,其主要目标是为Java开发者提供...

    httpclientjar包

    此外,HttpClient还提供了处理HTTPS请求的能力,这对于爬取使用HTTPS协议的网站非常有用。通过设置SSLContext和SecureProtocolSocketFactory,可以实现对HTTPS的安全访问。 在实际使用中,HttpClient可能会遇到各种...

    WebApi系列-通过HttpClient来调用WebApi接口.doc

    ##### 3.1 Get方式 Get方法通常用于从服务器获取资源。在Web API中,Get方法可以有多个重载版本,每个版本可以接受不同的参数组合。这些参数通常出现在URL中,作为查询字符串的一部分。 示例: ```csharp public ...

    Java抓取https网页数据

    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)

Global site tag (gtag.js) - Google Analytics