import javax.net.ssl.X509TrustManager; import java.io.*; import java.net.HttpURLConnection; import java.net.URL; import java.security.cert.CertificateException; import java.security.cert.X509Certificate; import javax.net.ssl.*; import org.apache.commons.lang.StringUtils; public class MyX509TrustManager implements X509TrustManager { public static void main(String[] args) { /*從https下載文件,並保存到桌面,文件名字段獲取*/ String path = "C:/Users/solexit06/Desktop/test/"; String urls="https://t1.huanqiu.cn/8093461e439c770c514176d9d1f4573a.jpg;https://t1.huanqiu.cn/8093461e439c770c514176d9d1f4573a.jpg"; if(!(urls==null||StringUtils.equals("", urls))){ String[] arr0=urls.split(";"); for(int h=0;h<arr0.length;h++){ String url=arr0[h]; if(!(url==null||StringUtils.equals("",url))){ String[] arr1=url.split("/"); if(arr1.length>0){ String dictory=path; String fileName=arr1[arr1.length-1]; fileName=(fileName!=null&&fileName.indexOf("?")==-1)?fileName:(fileName.substring(0, fileName.indexOf("?"))); System.out.println(fileName); try { downLoadFromUrlHttps(url,fileName, dictory); } catch (Exception e) { System.out.println(e.toString()); } } } } } /** * 從http獲取文件,文件名自己命名 */ try { downLoadFromUrlHttp("http://i3.sinaimg.cn/blog/2014/1029/S129809T1414550868715.jpg", "NBA.jpg", path); } catch (IOException e) { e.printStackTrace(); } } /* * 處理https GET/POST請求 請求地址、請求方法、參數 */ public static String httpsRequest(String requestUrl, String requestMethod, String outputStr) { StringBuffer buffer = null; try { // 創建SSLContext SSLContext sslContext = SSLContext.getInstance("SSL"); TrustManager[] tm = { new MyX509TrustManager() }; // 初始化 sslContext.init(null, tm, new java.security.SecureRandom()); ; // 獲取SSLSocketFactory對象 SSLSocketFactory ssf = sslContext.getSocketFactory(); // url對象 URL url = new URL(requestUrl); // 打開連接 HttpsURLConnection conn = (HttpsURLConnection) url.openConnection(); /** * 這一步的原因: 當訪問HTTPS的網址。您可能已經安裝了服務器證書到您的JRE的keystore * 但是服務器的名稱與證書實際域名不相等。這通常發生在你使用的是非標准網上簽發的證書。 * * 解決方法:讓JRE相信所有的證書和對系統的域名和證書域名。 * * 如果少了這一步會報錯:java.io.IOException: HTTPS hostname wrong: should be localhost */ conn.setHostnameVerifier(new MyX509TrustManager().new TrustAnyHostnameVerifier()); // 設置一些參數 conn.setDoOutput(true); conn.setDoInput(true); conn.setUseCaches(false); conn.setRequestMethod(requestMethod); // 設置當前實例使用的SSLSoctetFactory conn.setSSLSocketFactory(ssf); conn.connect(); // 往服務器端的參數 if (null != outputStr) { OutputStream os = conn.getOutputStream(); os.write(outputStr.getBytes("utf-8")); os.close(); } // 讀取服務器端返回的內容 InputStream is = conn.getInputStream(); //讀取內容 InputStreamReader isr = new InputStreamReader(is,"utf-8"); BufferedReader br = new BufferedReader(isr); buffer = new StringBuffer(); String line = null; while ((line = br.readLine()) != null) { buffer.append(line); } } catch (Exception e) { e.printStackTrace(); } return buffer.toString(); } public static void downLoadFromUrlHttps(String urlStr, String fileName, String savePath) throws Exception { // 創建SSLContext SSLContext sslContext = SSLContext.getInstance("SSL"); TrustManager[] tm = { new MyX509TrustManager() }; // 初始化 sslContext.init(null, tm, new java.security.SecureRandom()); // 獲取SSLSocketFactory對象 SSLSocketFactory ssf = sslContext.getSocketFactory(); // url對象 URL url = new URL(urlStr); // 打開連接 HttpsURLConnection conn = (HttpsURLConnection) url.openConnection(); /** * 這一步的原因: 當訪問HTTPS的網址。您可能已經安裝了服務器證書到您的JRE的keystore * 但是服務器的名稱與證書實際域名不相等。這通常發生在你使用的是非標准網上簽發的證書。 * * 解決方法:讓JRE相信所有的證書和對系統的域名和證書域名。 * * 如果少了這一步會報錯:java.io.IOException: HTTPS hostname wrong: should be <localhost> */ conn.setHostnameVerifier(new MyX509TrustManager().new TrustAnyHostnameVerifier()); // 設置一些參數 conn.setDoOutput(true); conn.setDoInput(true); conn.setUseCaches(false); // 設置當前實例使用的SSLSoctetFactory conn.setSSLSocketFactory(ssf); conn.connect(); // 得到輸入流 InputStream inputStream = conn.getInputStream(); byte[] getData = readInputStream(inputStream); // 文件保存位置 File saveDir = new File(savePath); if (!saveDir.exists()) { saveDir.mkdirs(); } //輸出流 File file = new File(saveDir + File.separator + fileName); FileOutputStream fos = new FileOutputStream(file); fos.write(getData); if (fos != null) { fos.close(); } if (inputStream != null) { inputStream.close(); } } /** * 從網絡http類型Url中下載文件 * * @param urlStr * @param fileName * @param savePath * @throws IOException */ public static void downLoadFromUrlHttp(String urlStr, String fileName, String savePath) throws IOException { URL url = new URL(urlStr); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); // 設置超時間為3秒 conn.setConnectTimeout(3 * 1000); // 防止屏蔽程序抓取而返回403錯誤 conn.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)"); conn.connect(); // 得到輸入流 InputStream inputStream = conn.getInputStream(); byte[] getData = readInputStream(inputStream); // 文件保存位置 File saveDir = new File(savePath); if (!saveDir.exists()) { saveDir.mkdirs(); } // 輸出流 File file = new File(saveDir + File.separator + fileName); FileOutputStream fos = new FileOutputStream(file); fos.write(getData); if (fos != null) { fos.close(); } if (inputStream != null) { inputStream.close(); } } /** * 從輸入流中獲取字節數組 * * @param inputStream * @return * @throws IOException */ public static byte[] readInputStream(InputStream inputStream) throws IOException { byte[] b = new byte[1024]; int len = 0; ByteArrayOutputStream bos = new ByteArrayOutputStream(); while ((len = inputStream.read(b)) != -1) { bos.write(b, 0, len); } bos.close(); return bos.toByteArray(); } /*** * 校驗https網址是否安全 * * @author solexit06 * */ public class TrustAnyHostnameVerifier implements HostnameVerifier { public boolean verify(String hostname, SSLSession session) { // 直接返回true:默認所有https請求都是安全的 return true; } } /* * 里面的方法都是空的,當方法為空是默認為所有的鏈接都為安全,也就是所有的鏈接都能夠訪問到 當然這樣有一定的安全風險,可以根據實際需要寫入內容 */ public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException { } public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException { } public X509Certificate[] getAcceptedIssuers() { return null; } }