package com.test;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.security.GeneralSecurityException;
import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSession;
import javax.net.ssl.X509TrustManager;
import javax.security.cert.CertificateException;
import javax.security.cert.X509Certificate;
/**
* @author zhang-long
* 讀取URL頁面中的內容,支援HTTP和HTTPS協議
*/
public class ReadURLUtil {
// X509TrustManager介面的執行個體管理使用哪一個 X509 認證來驗證遠端的安全通訊端。決定是根據信任的證
//書授權、認證撤消列表、線上狀態檢查或其他方式做出的。
private LmX509TrustManager xtm = new LmX509TrustManager();
//HostnameVerifier類是用於主機名稱驗證的基底介面
private LmHostnameVerifier hnv = new LmHostnameVerifier();
/**
* 初始化context及connection
*/
private void initContext() {
SSLContext sslContext = null;
try {
sslContext = SSLContext.getInstance("SSL", "SunJSSE");
X509TrustManager[] xtmArray = new X509TrustManager[]{xtm};
sslContext.init(null, xtmArray, new java.security.SecureRandom());
System.out.println("初始化正常!");
} catch (GeneralSecurityException gse) {
System.out.println("初始化SSL異常!" + gse);
}
if (sslContext != null) {
HttpsURLConnection.setDefaultSSLSocketFactory(sslContext
.getSocketFactory());
}
HttpsURLConnection.setDefaultHostnameVerifier(hnv);
}
// 以charSet為指定的編碼格式,讀取給出的urlStr的地址中的XML檔案字串
public String getString(String urlStr, String charSet) {
// String urlStr =
// "http://localhost:8080/SAP/eventTypeBusiness.do?method=query¤tPage=1&pageSize=10";
String errorMsg = "";
// 沒有設定字元集的時候,使用UTF-8的字元
if (charSet == null || "".equals(charSet)) {
charSet = "UTF-8";
}
try {
URL url = new URL(urlStr);
if ("https".equals(url.getProtocol())) {
// 初始化認證,信任HTTPS認證
initContext();
}
HttpURLConnection connection = (HttpURLConnection) url
.openConnection();
BufferedReader bufferedReader = new BufferedReader( new InputStreamReader(connection.getInputStream(), charSet));
StringBuffer buffer = new StringBuffer();
String line;
while ((line = bufferedReader.readLine()) != null) {
buffer.append(line + "\n");
}
bufferedReader.close();
return buffer.toString();
} catch (Exception e) {
e.printStackTrace();
return errorMsg;
}
}
public static void main(String[] args) {
String url = "https://login.taobao.com/member/login.jhtml";
//String url = "http://www.baidu.com";
System.out.println(url);
String charset = "gbk";
ReadURLUtil util = new ReadURLUtil();
String result = util.getString(url, charset);
System.out.println("result=" + result);
}
/**
* 認證信任管理器類
*/
private class LmX509TrustManager implements X509TrustManager {
public void checkClientTrusted(X509Certificate[] chain, String authType)
throws CertificateException {
}
public void checkServerTrusted(X509Certificate[] chain, String authType)
throws CertificateException {
}
@Override
public void checkClientTrusted(
java.security.cert.X509Certificate[] chain, String authType)
throws java.security.cert.CertificateException {
}
@Override
public void checkServerTrusted(
java.security.cert.X509Certificate[] chain, String authType)
throws java.security.cert.CertificateException {
}
@Override
public java.security.cert.X509Certificate[] getAcceptedIssuers() {
return null;
}
}
/**
* 主機校正類
*/
private class LmHostnameVerifier implements HostnameVerifier {
public boolean verify(String hostname, SSLSession session) {
return true;
}
}
}