1 package com.xing.test;
2
3 import java.io.BufferedReader;
4 import java.io.IOException;
5 import java.io.InputStreamReader;
6 import java.io.PrintWriter;
7 import java.net.HttpURLConnection;
8 import java.net.URL;
9
10 import javax.net.ssl.HostnameVerifier;
11 import javax.net.ssl.HttpsURLConnection;
12 import javax.net.ssl.SSLSession;
13
14 import org.apache.log4j.Logger;
15
16 public class HttpsTest {
17 private String url = "https://kyfw.12306.cn/";
18 private Logger logger;
19 public HttpsTest() {
20 logger = Logger.getLogger(HttpsTest.class);
21 }
22 private static void trustAllHttpsCertificates() throws Exception {
23 javax.net.ssl.TrustManager[] trustAllCerts = new javax.net.ssl.TrustManager[1];
24 javax.net.ssl.TrustManager tm = new miTM();
25 trustAllCerts[0] = tm;
26 javax.net.ssl.SSLContext sc = javax.net.ssl.SSLContext.getInstance("SSL","SunJSSE");
27 sc.init(null, trustAllCerts, null);
28 javax.net.ssl.HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
29 }
30
31 public String getData() {
32 PrintWriter out = null;
33 BufferedReader in = null;
34 HttpURLConnection conn = null;
35 String result = "";
36 try {
37 //该部分必须在获取connection前调用
38 trustAllHttpsCertificates();
39 HostnameVerifier hv = new HostnameVerifier() {
40 @Override
41 public boolean verify(String urlHostName, SSLSession session) {
42 logger.info("Warning: URL Host: " + urlHostName + " vs. " + session.getPeerHost());
43 return true;
44 }
45 };
46 HttpsURLConnection.setDefaultHostnameVerifier(hv);
47 conn = (HttpURLConnection)new URL(url).openConnection();
48 // 发送GET请求必须设置如下两行
49 conn.setDoInput(true);
50 conn.setRequestMethod("GET");
51 // // 发送POST请求必须设置如下两行
52 // conn.setDoOutput(true);
53 // conn.setDoInput(true);
54 //
55 // // 获取URLConnection对象对应的输出流
56 // out = new PrintWriter(conn.getOutputStream());
57 // // 发送请求参数
58 //// out.print(params);
59 // // flush输出流的缓冲
60 // out.flush();
61
62 //flush输出流的缓冲
63 in = new BufferedReader(new InputStreamReader(conn.getInputStream()));
64 String line;
65 while ((line = in.readLine()) != null) {
66 result += line;
67 }
68 } catch (Exception e) {
69 logger.error("发送 GET 请求出现异常! 请求ID:"+"
"+e.getMessage()+"
");
70 e.printStackTrace();
71 } finally {// 使用finally块来关闭输出流、输入流
72 try {
73 if (in != null) {
74 in.close();
75 }
76 } catch (IOException ex) {
77 logger.error("关闭数据流出错了!
"+ex.getMessage()+"
");
78 ex.printStackTrace();
79 }
80 }
81 // 获得相应结果result,可以直接处理......
82 return result;
83
84 }
85 static class miTM implements javax.net.ssl.TrustManager, javax.net.ssl.X509TrustManager {
86 public java.security.cert.X509Certificate[] getAcceptedIssuers() {
87 return null;
88 }
89
90 public boolean isServerTrusted(java.security.cert.X509Certificate[] certs) {
91 return true;
92 }
93
94 public boolean isClientTrusted(java.security.cert.X509Certificate[] certs) {
95 return true;
96 }
97
98 public void checkServerTrusted(java.security.cert.X509Certificate[] certs, String authType)
99 throws java.security.cert.CertificateException {
100 return;
101 }
102
103 public void checkClientTrusted(java.security.cert.X509Certificate[] certs, String authType)
104 throws java.security.cert.CertificateException {
105 return;
106 }
107 }
108 }
在连接之前调用
实现javax.net.ssl.X509TrustManager接口的三个方法,不用对方法进行改动,可以写成内部类,也可以重新写一个类