package com.doumee.core.utils; import lombok.extern.slf4j.Slf4j; import javax.net.ssl.*; import java.io.*; import java.net.HttpURLConnection; import java.net.URL; import java.security.KeyManagementException; import java.security.NoSuchAlgorithmException; import java.security.SecureRandom; import java.security.cert.CertificateException; import java.security.cert.X509Certificate; import java.util.HashMap; import java.util.LinkedHashMap; import java.util.Map; @Slf4j public class HttpsUtil { public static String get(String url,boolean ignoreSSL) { return connection(url, "GET", null, null,ignoreSSL); } public static String post(String url, String data, String contentType, boolean ignoreSSL) { return connection(url, "POST", data, contentType, ignoreSSL); } public static String postJson(String url, String data) { if(url.startsWith("https://")){ return connection(url, "POST", data, "application/json", true); }else{ return connectionHttp(url, "POST", data, "application/json"); } } public static String uploadTempMedia(String urlString ,String fileUrl){ HttpsURLConnection conn= null; try { String fileName = fileUrl.substring(fileUrl.lastIndexOf("/") + 1); // 获取网络图片 URL mediaUrl = new URL(fileUrl); HttpURLConnection meidaConn = (HttpURLConnection) mediaUrl.openConnection(); meidaConn.setDoOutput(true); meidaConn.setRequestMethod("GET"); String result = null; URL url=new URL(urlString); conn=(HttpsURLConnection) url.openConnection(); conn.setRequestMethod("POST");//以POST方式提交表单 conn.setDoInput(true); conn.setDoOutput(true); conn.setUseCaches(false);//POST方式不能使用缓存 //设置请求头信息 conn.setRequestProperty("Connection", "Keep-Alive"); conn.setRequestProperty("Charset", "UTF-8"); //设置边界 String BOUNDARY="----------"+System.currentTimeMillis(); conn.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + BOUNDARY); //请求正文信息 //第一部分 StringBuilder sb=new StringBuilder(); sb.append("--");//必须多两条道 sb.append(BOUNDARY); sb.append("\r\n"); sb.append("Content-Disposition: form-data;name=\"media\"; filename=\"" + fileName+"\"\r\n"); sb.append("Content-Type:application/octet-stream\r\n\r\n"); System.out.println("sb:"+sb); //获得输出流 OutputStream out=new DataOutputStream(conn.getOutputStream()); //输出表头 out.write(sb.toString().getBytes("UTF-8")); //文件正文部分 //把文件以流的方式 推送道URL中 DataInputStream din=new DataInputStream(meidaConn.getInputStream()); int bytes=0; byte[] buffer=new byte[1024]; while((bytes=din.read(buffer))!=-1){ out.write(buffer,0,bytes); } din.close(); //结尾部分 byte[] foot=("\r\n--" + BOUNDARY + "--\r\n").getBytes("UTF-8");//定义数据最后分割线 out.write(foot); out.flush(); out.close(); if(HttpsURLConnection.HTTP_OK==conn.getResponseCode()){ InputStream is = conn.getInputStream(); byte[] b = new byte[4096]; ByteArrayOutputStream baos = new ByteArrayOutputStream(b.length); int len; while ((len = is.read(b)) != -1) { baos.write(b, 0, len); } is.close(); return baos.toString("utf-8"); } return result; } catch (Exception e) { e.printStackTrace(); } finally { if(conn != null){ conn.disconnect(); } } return null; } public static String connection(String url,String method,String data,String contentType,boolean ignoreSSL){ HttpsURLConnection connection = null; try { URL _url = new URL(url); connection = (HttpsURLConnection) _url.openConnection(); connection.setRequestMethod(method); connection.setDoOutput(true); connection.setDoInput(true); connection.setUseCaches(false); if(contentType != null){ connection.setRequestProperty("Content-Type", contentType); } if(ignoreSSL){ //信任所有ssl证书和主机 TrustManager[] trustManagers = {new HttpsTrustManager()}; SSLContext context = SSLContext.getInstance("TLS"); context.init(null, trustManagers, new SecureRandom()); connection.setSSLSocketFactory(context.getSocketFactory()); connection.setHostnameVerifier(new HostnameVerifier() { @Override public boolean verify(String hostname, SSLSession session) { return true; } }); } connection.connect(); if(data != null){ OutputStream outputStream = connection.getOutputStream(); outputStream.write(data.getBytes("utf-8")); outputStream.close(); } int responseCode = connection.getResponseCode(); if (responseCode == HttpsURLConnection.HTTP_OK) { InputStream is = connection.getInputStream(); byte[] b = new byte[4096]; ByteArrayOutputStream baos = new ByteArrayOutputStream(b.length); int len; while ((len = is.read(b)) != -1) { baos.write(b, 0, len); } is.close(); return baos.toString("utf-8"); } return connection.getResponseMessage(); } catch (Exception e) { e.printStackTrace(); } finally { if(connection != null){ connection.disconnect(); } } return null; } public static InputStream connectionInputsteam(String url,String method,String data,String contentType ){ HttpURLConnection connection = null; try { URL _url = new URL(url); connection = (HttpURLConnection) _url.openConnection(); System.out.println(connection.getContentLength()); connection.setDoOutput(true); connection.setRequestMethod("GET"); return connection.getInputStream(); } catch (Exception e) { e.printStackTrace(); } return null; } public static Map connInputsteamReturnMap(String url, String method, String data, String contentType ){ HttpURLConnection connection = null; try { Map map = new HashMap<>(); URL _url = new URL(url); connection = (HttpURLConnection) _url.openConnection(); connection.setDoOutput(true); connection.setRequestMethod("GET"); int size =connection.getContentLength(); log.error("企业图片下载流实际大小:=========================="+size); InputStream in =connection.getInputStream(); if(in == null){ log.error("企业图片下载流实际流为空:=========================="); return null; } log.error("企业图片下载流大小:=========================="+in.available()); map.put("data",in); map.put("size",size); return map; } catch (Exception e) { e.printStackTrace(); } return null; } public static String connectionHttp(String url,String method,String data,String contentType ){ HttpURLConnection connection = null; try { URL _url = new URL(url); connection = (HttpURLConnection) _url.openConnection(); connection.setRequestMethod(method); connection.setDoOutput(true); connection.setDoInput(true); connection.setUseCaches(false); if(contentType != null){ connection.setRequestProperty("Content-Type", contentType); } connection.connect(); if(data != null){ OutputStream outputStream = connection.getOutputStream(); outputStream.write(data.getBytes("utf-8")); outputStream.close(); } int responseCode = connection.getResponseCode(); if (responseCode == HttpsURLConnection.HTTP_OK) { InputStream is = connection.getInputStream(); byte[] b = new byte[4096]; ByteArrayOutputStream baos = new ByteArrayOutputStream(b.length); int len; while ((len = is.read(b)) != -1) { baos.write(b, 0, len); } is.close(); return baos.toString("utf-8"); } return connection.getResponseMessage(); } catch (Exception e) { e.printStackTrace(); } finally { if(connection != null){ connection.disconnect(); } } return null; } public static void main(String[] args) { //局部信任所有证书和主机 String result = HttpsUtil.get("https://127.0.0.1:8443/ssl-test/test01.do",true); System.out.println(result); //外部信任所有证书和主机 HttpsTrustManager.allowAllSSL(); String response = HttpsUtil.get("https://127.0.0.1:8443/ssl-test/test01.do", false); System.out.println(result); } } class HttpsTrustManager implements X509TrustManager { private static TrustManager[] trustManagers = {new HttpsTrustManager()}; @Override public void checkClientTrusted(X509Certificate[] arg0, String arg1) throws CertificateException { // TODO Auto-generated method stub } @Override public void checkServerTrusted(X509Certificate[] arg0, String arg1) throws CertificateException { // TODO Auto-generated method stub } @Override public X509Certificate[] getAcceptedIssuers() { // TODO Auto-generated method stub return null; } public static void allowAllSSL() { try { SSLContext context = SSLContext.getInstance("TLS"); context.init(null, trustManagers, new SecureRandom()); HttpsURLConnection.setDefaultSSLSocketFactory(context.getSocketFactory()); HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier() { @Override public boolean verify(String hostname, SSLSession session) { return true; } }); } catch (NoSuchAlgorithmException | KeyManagementException e) { e.printStackTrace(); } } }