HttpClient模拟登录12306购票网站

首先12306网站前缀为“https://” 表明是用SSL加密。

用HttpClient去模拟发送请求时,对于URL用为“https”时,先要解决证书问题,美国服务器,有两种解决方案:

   a.使证书被信任。

   在查找相关资料时,对于这种方法有点麻烦,最后就没有去尝试,网站空间,有兴趣的朋友可以试试。

b.使用httpClient时不检测服务器证书是否可信

    扩展HttpClient类实现自动接受证书,因为这种方法自动接收所有证书,因此存在一定的安全问题,香港服务器租用,所以在使用这种方法前请仔细考虑您的系统的安全需求。

具体的步骤如下:

•提供一个自定义的socket factory(test.MySecureProtocolSocketFactory)。这个自定义的类必须实现接口

org.apache.commons.httpclient.protocol.SecureProtocolSocketFactory,在实现接口的类中调用自定义的

X509TrustManager(test.MyX509TrustManager)

•创建一个org.apache.commons.httpclient.protocol.Protocol的实例,指定协议名称和默认的端口号

Protocol myhttps = new Protocol(“https”, new MySecureProtocolSocketFactory (), 443);

•注册刚才创建的https协议对象

Protocol.registerProtocol(“https “, myhttps);

具体代码如下:

1 package org.study.meteor.ticket.util; java.io.IOException; 4 import java.net.InetAddress; 5 import java.net.InetSocketAddress; 6 import java.net.Socket; 7 import java.net.SocketAddress; 8 import java.net.UnknownHostException; 9 import java.security.KeyManagementException; 10 import java.security.NoSuchAlgorithmException; 11 import java.security.cert.CertificateException; 12 import java.security.cert.X509Certificate; javax.net.SocketFactory; 15 import javax.net.ssl.SSLContext; 16 import javax.net.ssl.TrustManager; 17 import javax.net.ssl.X509TrustManager; org.apache.commons.httpclient.ConnectTimeoutException; 20 import org.apache.commons.httpclient.params.HttpConnectionParams; 21 import org.apache.commons.httpclient.protocol.SecureProtocolSocketFactory; * MySecureProtocolSocketFactory.java.java Create on 2012-9-26下午1:15:03 25 * 26 * 27 * Copyright (c) 2012 by MTA. 28 * lmeteor 30 * @Email txin0814@sina.com 31 * @description 自定义的socket factory 实现自动接受证书 1.0MySecureProtocolSocketFactory implements 35 SecureProtocolSocketFactory 36 {SSLContext sslcontext = null; SSLContext createSSLContext() 41 { 42SSLContext sslcontext = null;{ 45sslcontext = SSLContext.getInstance(“SSL”); 46sslcontext.init(null, new TrustManager[] 47{ new TrustAnyTrustManager() }, new java.security.SecureRandom()); 48 } 49catch (NoSuchAlgorithmException e) 50 { 51 e.printStackTrace(); 52 } 53catch (KeyManagementException e) 54 { 55 e.printStackTrace(); 56 } 57return sslcontext; 58 } SSLContext getSSLContext() 61 { 62if (this.sslcontext == null) 63 { 64this.sslcontext = createSSLContext(); 65 }.sslcontext; 67 }Socket createSocket(Socket socket, String host, int port, 70boolean autoClose) throws IOException, UnknownHostException 71 { 72return getSSLContext().getSocketFactory().createSocket(socket, host, 73 port, autoClose); 74 }Socket createSocket(String host, int port) throws IOException, 77 UnknownHostException 78 { 79return getSSLContext().getSocketFactory().createSocket(host, port); 80 }Socket createSocket(String host, int port, InetAddress clientHost, 83int clientPort) throws IOException, UnknownHostException 84 { 85return getSSLContext().getSocketFactory().createSocket(host, port, 86 clientHost, clientPort); 87 }Socket createSocket(String host, int port, InetAddress localAddress, 90int localPort, HttpConnectionParams params) throws IOException, 91 UnknownHostException, ConnectTimeoutException 92 { 93if (params == null) 94 {IllegalArgumentException(“Parameters may not be null”); 96 } 97int timeout = params.getConnectionTimeout(); 98SocketFactory socketfactory = getSSLContext().getSocketFactory(); 99if (timeout == 0)100 {101return socketfactory.createSocket(host, port, localAddress,102 localPort);103 }{106Socket socket = socketfactory.createSocket();107SocketAddress localaddr = new InetSocketAddress(localAddress,108 localPort);109SocketAddress remoteaddr = new InetSocketAddress(host, port);110 socket.bind(localaddr);111 socket.connect(remoteaddr, timeout);112return socket;113 }114 }TrustAnyTrustManager implements X509TrustManager118 { checkClientTrusted(X509Certificate[] chain, String authType)121throws CertificateException122 {123 } checkServerTrusted(X509Certificate[] chain, String authType)126throws CertificateException127 {128 } X509Certificate[] getAcceptedIssuers()131 { X509Certificate[]133 {};134 }135 }136 }累死累活不说,走马观花反而少了真实体验,

HttpClient模拟登录12306购票网站

相关文章:

你感兴趣的文章:

标签云: