java 12306 模拟登陆_请教java尝试模拟登录12306时遇到的一个问题

展开全部

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

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

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

扩展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;

2

3 import 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;

13

14 import javax.net.SocketFactory;

15 import javax.net.ssl.SSLContext;

16 import javax.net.ssl.TrustManager;

17 import javax.net.ssl.X509TrustManager;

18

19 import org.apache.commons.httpclient.ConnectTimeoutException;

20 import org.apache.commons.httpclient.params.HttpConnectionParams;

21 import org.apache.commons.httpclient.protocol.SecureProtocolSocketFactory;

22

23 /**

24 * MySecureProtocolSocketFactory.java.java Create on 2012-9-26下午1:15:03

25 *

26 *

27 * Copyright (c) 2012 by MTA.

28 *

29 * @author lmeteor

30 * @Email txin0814@sina.com

31 * @description 自定义的socket factory 实现自动接受证书

32 * @version 1.0

33 */

34 public class MySecureProtocolSocketFactory implements

35 SecureProtocolSocketFactory

36 {

37

38 private SSLContext sslcontext = null;

39

40 private SSLContext createSSLContext()

41 {

42 SSLContext sslcontext = null;

43 try

44 {

45 sslcontext = SSLContext.getInstance("SSL");

46 sslcontext.init(null, new TrustManager[]

47 { new TrustAnyTrustManager() }, new java.security.SecureRandom());

48 }

49 catch (NoSuchAlgorithmException e)

50 {

51 e.printStackTrace();

52 }

53 catch (KeyManagementException e)

54 {

55 e.printStackTrace();

56 }

57 return sslcontext;

58 }

59

60 private SSLContext getSSLContext()

61 {

62 if (this.sslcontext == null)

63 {

64 this.sslcontext = createSSLContext();

65 }

66 return this.sslcontext;

67 }

68

69 public Socket createSocket(Socket socket, String host, int port,

70 boolean autoClose) throws IOException, UnknownHostException

71 {

72 return getSSLContext().getSocketFactory().createSocket(socket, host,

73 port, autoClose);

74 }

75

76 public Socket createSocket(String host, int port) throws IOException,

77 UnknownHostException

78 {

79 return getSSLContext().getSocketFactory().createSocket(host, port);

80 }

81

82 public Socket createSocket(String host, int port, InetAddress clientHost,

83 int clientPort) throws IOException, UnknownHostException

84 {

85 return getSSLContext().getSocketFactory().createSocket(host, port,

86 clientHost, clientPort);

87 }

88

89 public Socket createSocket(String host, int port, InetAddress localAddress,

90 int localPort, HttpConnectionParams params) throws IOException,

91 UnknownHostException, ConnectTimeoutException

92 {

93 if (params == null)

94 {

95 throw new IllegalArgumentException("Parameters may not be null");

96 }

97 int timeout = params.getConnectionTimeout();

98 SocketFactory socketfactory = getSSLContext().getSocketFactory();

99 if (timeout == 0)

100 {

101 return socketfactory.createSocket(host, port, localAddress,

102 localPort);

103 }

104 else

105 {

106 Socket socket = socketfactory.createSocket();

107 SocketAddress localaddr = new InetSocketAddress(localAddress,

108 localPort);

109 SocketAddress remoteaddr = new InetSocketAddress(host, port);

110 socket.bind(localaddr);

111 socket.connect(remoteaddr, timeout);

112 return socket;

113 }

114 }

115

116 // 自定义私有类

117 private static class TrustAnyTrustManager implements X509TrustManager

118 {

119

120 public void checkClientTrusted(X509Certificate[] chain, String authType)

121 throws CertificateException

122 {

123 }

124

125 public void checkServerTrusted(X509Certificate[] chain, String authType)

126 throws CertificateException

127 {

128 }

129

130 public X509Certificate[] getAcceptedIssuers()

131 {

132 return new X509Certificate[]

133 {};

134 }

135 }

136 }

本回答由提问者推荐

2Q==

已赞过

已踩过<

你对这个回答的评价是?

评论

收起

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值