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 请求出现异常!\t请求ID:"+"\n"+e.getMessage()+"\n"); 70 e.printStackTrace(); 71 } finally {// 使用finally块来关闭输出流、输入流 72 try { 73 if (in != null) { 74 in.close(); 75 } 76 } catch (IOException ex) { 77 logger.error("关闭数据流出错了!\n"+ex.getMessage()+"\n"); 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接口的三个方法,不用对方法进行改动,可以写成内部类,也可以重新写一个类
