工作中的需要,使用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); }