工作中的需要,使用Apache httpclient发起获取通过https返回的内容,试了很多网上的解决办法都不行,查阅了Apache httpclient的官方文档,最后终于找出解决方法,分享给需要的朋友,免得走弯路。
使用时,调用getSSL方法即可获取https地址返回的内容。
代码如下:
public static String getSSL(String url, String responseDecode) throws IOException { CloseableHttpClient httpclient = createSSLInsecureClient(); CloseableHttpResponse response = null; String content = null; try { HttpGet httpget = new HttpGet(url); RequestConfig requestConfig = RequestConfig.custom().setSocketTimeout(5000).setConnectTimeout(5000) .setConnectionRequestTimeout(5000).build(); httpget.setConfig(requestConfig); response = httpclient.execute(httpget); HttpEntity entity = response.getEntity(); if (entity != null) { content = EntityUtils.toString(entity); EntityUtils.consume(entity); } } catch (ParseException e) { logger.error("request URL[" + url + "] error", e); throw e; } catch (IOException e) { logger.error("request URL[" + url + "] error", e); throw e; } finally { if (response != null) { try { response.close(); } catch (IOException e) { logger.error("", e); } } if (httpclient != null) { try { httpclient.close(); } catch (IOException e) { logger.error("", e); } } } return content; } private static CloseableHttpClient createSSLInsecureClient() { try { SSLContext sslContext = new SSLContextBuilder().loadTrustMaterial(null, new TrustStrategy() { @Override public boolean isTrusted(java.security.cert.X509Certificate[] arg0, String arg1) { return true; } }).build(); SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslContext); return HttpClients.custom().setSSLSocketFactory(sslsf).build(); } catch (KeyManagementException e) { e.printStackTrace(); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } catch (KeyStoreException e) { e.printStackTrace(); } return HttpClients.createDefault(); } public static void main(String[] args) { ShiroUser user = UMSHelper.invoke("10001", "10102130023000"); System.out.println(user); }