1. 程式人生 > >HttpClient不驗證證書通過代理模擬登陸HTTPS的例子

HttpClient不驗證證書通過代理模擬登陸HTTPS的例子

Java程式碼  收藏程式碼
  1. package com;  
  2. public class HttpClientLoginProxy {  
  3. public static void main(String[] args) throws Exception{  
  4.         CookieStore cookieStore = new BasicCookieStore();  
  5.         HttpClientContext context = HttpClientContext.create();  
  6.         context.setCookieStore(cookieStore);  
  7.         RequestConfig globalConfig = RequestConfig.custom().setCookieSpec(CookieSpecs.BROWSER_COMPATIBILITY).build();  
  8.         SSLContext sslcontext = SSLContexts.custom().loadTrustMaterial(nullnew TrustSelfSignedStrategy()).build();  
  9.         CredentialsProvider credsProvider = new BasicCredentialsProvider();  
  10.         //設定https驗證的代理,8002為代理Port  
  11.         credsProvider.setCredentials(new AuthScope("ProxyIp"8002),new UsernamePasswordCredentials("yourProxyId"
    "yourProxyPwd"));  
  12.         SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslcontext,new String[] { "TLSv1" },null,SSLConnectionSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);  
  13.         CloseableHttpClient httpclient = HttpClients.custom().setDefaultRequestConfig(globalConfig).setDefaultCredentialsProvider(credsProvider).setDefaultCookieStore(cookieStore).setSSLSocketFactory(sslsf).build();  
  14.         try {  
  15.             HttpHost httpHost = new HttpHost("yourHostIp"443"https");  
  16.             //設定代理,8002為代理Port  
  17.             HttpHost proxy = new HttpHost("ProxyIp"8002);  
  18.             RequestConfig config = RequestConfig.custom().setProxy(proxy).build();  
  19.             //Login的URL  
  20.             HttpPost httppost = new HttpPost("/LOGIN");  
  21.             httppost.setConfig(config);  
  22.             //表單填寫  
  23.             List<NameValuePair> formparams = new ArrayList<NameValuePair>();  
  24.             formparams.add(new BasicNameValuePair("admin""admin"));  
  25.             formparams.add(new BasicNameValuePair("password""password"));  
  26.             formparams.add(new BasicNameValuePair("destination""/index.html"));  
  27.             UrlEncodedFormEntity entity = new UrlEncodedFormEntity(formparams, Consts.UTF_8);  
  28.             httppost.setEntity(entity);  
  29.             //System.out.println("Executing request " + httppost.getRequestLine()   + " to " + httppost + " via " + proxy);  
  30.             ResponseHandler<String> responseHandler = new ResponseHandler<String>() {  
  31.                 public String handleResponse(final HttpResponse response) throws ClientProtocolException, IOException {  
  32.                     int status = response.getStatusLine().getStatusCode();  
  33.                     //status可以手動登陸後用firebug或者fiddler抓取返回  
  34.                     if (status >= 200 && status < 303) {  
  35.                         HttpEntity entity = response.getEntity();  
  36.                         return entity != null ? EntityUtils.toString(entity) : null;  
  37.                     } else {  
  38.                         throw new ClientProtocolException("Unexpected response status: " + status);  
  39.                     }  
  40.                 }  
  41.             };  
  42.             //登入  
  43.             System.out.println("===========執行登入=============");  
  44.             String response = httpclient.execute(httpHost,httppost,responseHandler,context);  
  45.             System.out.println(response);  
  46.             httppost.releaseConnection();  
  47.             System.out.println("===========訪問第二個頁面===========");  
  48.             //訪問登陸後的第二個頁面,並打印出來,這邊要注意第二個頁面是Post還是Get方式提交表單,如果是post請用HttpPost  
  49.             HttpGet httpgetConn = new HttpGet("yourNextPageUrl");  
  50.             httpgetConn.setConfig(config);  
  51.             String responseConn = httpclient.execute(httpHost,httpgetConn,responseHandler);  
  52.             System.out.println(responseConn);  
  53.         } finally {  
  54.             httpclient.close();  
  55.         }  
  56.     }  
  57. }  


  主要需要注意的是代理的配置以及表單域引數還有提交方式。 
  可以手動登陸後用firebug或者fiddler抓取返回的status以及表單的元素。 
  這個例子是可以不下載證書登入https的,如果想要以下載證書的方式,可以用比如說chrome下載了https的證書然後載入到jdk中,具體可以網上查下,但是如果網站更新了證書,模擬登陸也需要重新匯入證書。 
  如果不需要使用代理,可以將proxy涉及的程式碼去掉,即可以直接登入。