http https信任任何证书的工具类

来源:互联网 发布:阿里数据银行 编辑:程序博客网 时间:2024/06/05 23:40



转载:http://www.cnblogs.com/handsomeye/p/5802448.html

向原作者致敬,如有冒犯可联系本人删除即可.


import java.io.BufferedReader;   import java.io.InputStream;   import java.io.InputStreamReader;   import java.io.OutputStream;   import java.net.HttpURLConnection;   import java.net.URL;   import java.net.URLEncoder;   import java.util.Map;  import java.util.Map.Entry;    import javax.net.ssl.HostnameVerifier;  import javax.net.ssl.HttpsURLConnection;  import javax.net.ssl.SSLContext;  import javax.net.ssl.SSLSession;  import javax.net.ssl.SSLSocketFactory;  import javax.net.ssl.TrustManager;    import org.springframework.util.StringUtils;   /**   * http、https 请求工具类, 微信为https的请求   * @author yehx   *   */  public class HttpUtil {        private static final String DEFAULT_CHARSET = "UTF-8";        private static final String _GET = "GET"; // GET      private static final String _POST = "POST";// POST      public static final int DEF_CONN_TIMEOUT = 30000;      public static final int DEF_READ_TIMEOUT = 30000;        /**       * 初始化http请求参数      *       * @param url      * @param method       * @param headers       * @return       * @throws Exception       */      private static HttpURLConnection initHttp(String url, String method,              Map<String, String> headers) throws Exception {         URL _url = new URL(url);          HttpURLConnection http = (HttpURLConnection) _url.openConnection();          // 连接超时          http.setConnectTimeout(DEF_CONN_TIMEOUT);          // 读取超时 --服务器响应比较慢,增大时间          http.setReadTimeout(DEF_READ_TIMEOUT);          http.setUseCaches(false);          http.setRequestMethod(method);          http.setRequestProperty("Content-Type",                  "application/x-www-form-urlencoded");          http.setRequestProperty(                  "User-Agent",                  "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.146 Safari/537.36");          if (null != headers && !headers.isEmpty()) {              for (Entry<String, String> entry : headers.entrySet()) {                  http.setRequestProperty(entry.getKey(), entry.getValue());              }          }          http.setDoOutput(true);          http.setDoInput(true);          http.connect();         return http;      }        /**       * 初始化http请求参数       *        * @param url       * @param method       * @return       * @throws Exception       */      private static HttpsURLConnection initHttps(String url, String method,              Map<String, String> headers) throws Exception {          TrustManager[] tm = { new MyX509TrustManager() };          System.setProperty("https.protocols", "TLSv1");          SSLContext sslContext = SSLContext.getInstance("TLS");          sslContext.init(null, tm, new java.security.SecureRandom());          // 从上述SSLContext对象中得到SSLSocketFactory对象          SSLSocketFactory ssf = sslContext.getSocketFactory();          URL _url = new URL(url);          HttpsURLConnection http = (HttpsURLConnection) _url.openConnection();          // 设置域名校验          http.setHostnameVerifier(new HttpUtil().new TrustAnyHostnameVerifier());          // 连接超时          http.setConnectTimeout(DEF_CONN_TIMEOUT);          // 读取超时 --服务器响应比较慢,增大时间          http.setReadTimeout(DEF_READ_TIMEOUT);          http.setUseCaches(false);          http.setRequestMethod(method);          http.setRequestProperty("Content-Type",                  "application/x-www-form-urlencoded");          http.setRequestProperty(                  "User-Agent",                  "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.146 Safari/537.36");         if (null != headers && !headers.isEmpty()) {             for (Entry<String, String> entry : headers.entrySet()) {                 http.setRequestProperty(entry.getKey(), entry.getValue());             }         }         http.setSSLSocketFactory(ssf);         http.setDoOutput(true);         http.setDoInput(true);         http.connect();         return http;     }      /**     *       * @description 功能描述: get 请求      * @return 返回类型:      * @throws Exception      */     public static String get(String url, Map<String, String> params,             Map<String, String> headers) throws Exception {         HttpURLConnection http = null;         if (isHttps(url)) {             http = initHttps(initParams(url, params), _GET, headers);         } else {             http = initHttp(initParams(url, params), _GET, headers);         }         InputStream in = http.getInputStream();         BufferedReader read = new BufferedReader(new InputStreamReader(in,                 DEFAULT_CHARSET));         String valueString = null;         StringBuffer bufferRes = new StringBuffer();         while ((valueString = read.readLine()) != null) {             bufferRes.append(valueString);         }         in.close();         if (http != null) {             http.disconnect();// 关闭连接         }         return bufferRes.toString();     }      public static String get(String url) throws Exception {         return get(url, null);     }      public static String get(String url, Map<String, String> params)             throws Exception {         return get(url, params, null);     }      public static String post(String url, String params)             throws Exception {         HttpURLConnection http = null;         if (isHttps(url)) {             http = initHttps(url, _POST, null);         } else {             http = initHttp(url, _POST, null);         }         OutputStream out = http.getOutputStream();         out.write(params.getBytes(DEFAULT_CHARSET));         out.flush();         out.close();          InputStream in = http.getInputStream();         BufferedReader read = new BufferedReader(new InputStreamReader(in,                 DEFAULT_CHARSET));        String valueString = null;         StringBuffer bufferRes = new StringBuffer();         while ((valueString = read.readLine()) != null) {            bufferRes.append(valueString);         }         in.close();         if (http != null) {             http.disconnect();// 关闭连接        }         return bufferRes.toString();     }      /**      * 功能描述: 构造请求参数      *       * @return 返回类型:      * @throws Exception      */     public static String initParams(String url, Map<String, String> params)             throws Exception {         if (null == params || params.isEmpty()) {             return url;         }         StringBuilder sb = new StringBuilder(url);         if (url.indexOf("?") == -1) {             sb.append("?");         }         sb.append(map2Url(params));         return sb.toString();     }      /**     * map构造url      *       * @return 返回类型:      * @throws Exception      */     public static String map2Url(Map<String, String> paramToMap)             throws Exception {         if (null == paramToMap || paramToMap.isEmpty()) {             return null;         }         StringBuffer url = new StringBuffer();         boolean isfist = true;         for (Entry<String, String> entry : paramToMap.entrySet()) {            if (isfist) {                isfist = false;             } else {                 url.append("&");             }             url.append(entry.getKey()).append("=");             String value = entry.getValue();             if (!StringUtils.isEmpty(value)) {                 url.append(URLEncoder.encode(value, DEFAULT_CHARSET));             }         }         return url.toString();     }      /**      * 检测是否https      *       * @param url      */    private static boolean isHttps(String url) {         return url.startsWith("https");     }      /**      * https 域名校验      *       * @param url      * @param params      * @return      */     public class TrustAnyHostnameVerifier implements HostnameVerifier {         public boolean verify(String hostname, SSLSession session) {             return true;// 直接返回true         }     } }

/** * 证书信任管理器(用于https请求) *  */public class MyX509TrustManager implements X509TrustManager {// 检查客户端证书public void checkClientTrusted(X509Certificate[] chain, String authType)throws CertificateException {}// 检查服务器端证书public void checkServerTrusted(X509Certificate[] chain, String authType)throws CertificateException {}// 返回受信任的x509数组public X509Certificate[] getAcceptedIssuers() {return null;}}


原创粉丝点击