package com.jackson.net; import org.apache.http.Header; import org.apache.http.client.config.CookieSpecs; import org.apache.http.client.config.RequestConfig; import org.apache.http.conn.ssl.SSLConnectionSocketFactory; import org.apache.http.conn.ssl.TrustStrategy; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClients; import org.apache.http.impl.conn.PoolingHttpClientConnectionManager; import org.apache.http.message.BasicHeader; import org.apache.http.ssl.SSLContextBuilder; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import javax.net.ssl.HostnameVerifier; import javax.net.ssl.SSLContext; import javax.net.ssl.SSLSession; import java.security.GeneralSecurityException; import java.security.cert.CertificateException; import java.security.cert.X509Certificate; import java.util.ArrayList; import java.util.Collection; /** * Created by Jackson on 2016/10/26. */ public enum HttpClientCreater { instance; private static Logger logger = LogManager.getLogger(HttpClientCreater.class.getName()); private PoolingHttpClientConnectionManager cm ; private CloseableHttpClient httpClient; private CloseableHttpClient httpsClient; HttpClientCreater(){ cm = new PoolingHttpClientConnectionManager(); cm.setMaxTotal(200); } public CloseableHttpClient getHttpClient() { if(httpClient==null){ synchronized (CloseableHttpClient.class){ if(httpClient==null){ httpClient = HttpClients.custom() .setDefaultRequestConfig(getDefaultRequestConfig()) .setDefaultHeaders(getDefaultHeaders()) .setConnectionManager(cm) .build(); } } } logger.debug("获取httpClient"); return httpClient; } public CloseableHttpClient getHttpsClient(){ if(httpsClient==null){ synchronized (CloseableHttpClient.class){ if(httpsClient==null){ httpsClient = HttpClients.custom() .setDefaultRequestConfig(getDefaultRequestConfig()) .setDefaultHeaders(getDefaultHeaders()) .setConnectionManager(cm) .setSSLSocketFactory(getSSLSocketFactory()) .build(); } } } logger.debug("获取httpsClient"); return httpsClient; } public static Collection<? extends Header> getDefaultHeaders() { ArrayList<Header> headers = new ArrayList(); headers.add(new BasicHeader("Accept-Charset", "utf-8")); headers.add(new BasicHeader("Cache-Control", "no-cache")); headers.add(new BasicHeader("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8")); headers.add(new BasicHeader("Accept-Language", "zh-CN,zh;q=0.8")); headers.add(new BasicHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.104 Safari/537.36 Core/1.53.1952.400 QQBrowser/9.5.10023.400")); headers.add(new BasicHeader("Accept-Encoding", "gzip, deflate, sdch")); return headers; } private static RequestConfig getDefaultRequestConfig() { return RequestConfig.custom().setConnectTimeout(5000) .setConnectionRequestTimeout(5000) .setSocketTimeout(5000) .setCookieSpec(CookieSpecs.STANDARD_STRICT) .build(); } /** * 创建SSL安全连接,不验证安全性(爬虫下安全性要求不高) * @return */ public static SSLConnectionSocketFactory getSSLSocketFactory() { SSLConnectionSocketFactory sslsf = null; try { SSLContext sslContext = new SSLContextBuilder().loadTrustMaterial(null, new TrustStrategy() { public boolean isTrusted(X509Certificate[] chain, String authType) throws CertificateException { return true; } }).build(); sslsf = new SSLConnectionSocketFactory(sslContext,new HostnameVerifier(){ @Override public boolean verify(String s, SSLSession sslSession) { return true; } }); } catch (GeneralSecurityException e) { e.printStackTrace(); } return sslsf; } }