2017-10-20 24 views
0

J'ai écrit un moteur de balayage JAVA et j'essaie d'utiliser proxy et d'ignorer https certification.InternalHttpClient.getParams() avec UnsupportedOperationException

Mais il ne fonctionne pas avec

java.lang.UnsupportedOperationException (à org.apache.http.impl.client.InternalHttpClient.getParams)

J'ai cherché des solutions qui disent la plupart du temps La version de mon HttpClient est ancienne, mais je mets à jour la dernière version du site apache, cette exception est toujours arrivée.

code suivi est mon code crawler:

public static void main(String[] args) { 
    try{ 
     TrustManager[] trustAllCerts = new TrustManager[] { 
      new X509TrustManager() { 
       public X509Certificate[] getAcceptedIssuers() { 
         return null; 
        } 
       public void checkClientTrusted(X509Certificate[] certs, String authType) {} 
       public void checkServerTrusted(X509Certificate[] certs, String authType) {} 
       } 
     }; 
     SSLContext ctx = SSLContext.getInstance("TLS"); 
     ctx.init(null, trustAllCerts, null); 
     LayeredConnectionSocketFactory sslSocketFactory = new SSLConnectionSocketFactory(ctx); 
     CloseableHttpClient client = HttpClients.custom().setSSLSocketFactory(sslSocketFactory).build();    
     HttpHost proxy = new HttpHost("127.0.0.1", 8888,"http"); 
     client.getParams().setParameter(ConnRoutePNames.DEFAULT_PROXY,proxy); 
     HttpGet request = new HttpGet("https://www.javaworld.com.tw/jute/post/view?bid=29&id=312144"); 
     CloseableHttpResponse response = client.execute(request); 
     String entity = EntityUtils.toString(response.getEntity(), "utf-8"); 
     System.out.println(entity); 
    }catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

Merci beaucoup pour toutes les solutions.

Répondre

0

J'ai eu le même problème et c'était parce que la méthode est dépréciée et n'est pas disponible dans les dernières versions.

J'ai essayé le code ci-dessous et cela a fonctionné pour moi

 public static HttpClient createClient() { 
     try { 
      SSLContextBuilder builder = new SSLContextBuilder(); 
      builder.useProtocol("TLSv1.2"); 
      builder.loadTrustMaterial(null, new TrustStrategy() { 
       @Override 
       public boolean isTrusted(X509Certificate[] chain, String authType) throws CertificateException { 
        return true; 
       } 
      }); 
      SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(
        builder.build()); 

      HttpClientBuilder hcBuilder = HttpClients.custom(); 
      HttpHost httpProxy = new HttpHost(bundle.getString("PROXY_HOST"), Integer.parseInt(bundle.getString("PROXY_PORT"))); 
      DefaultProxyRoutePlanner routePlanner = new DefaultProxyRoutePlanner(httpProxy); 
      hcBuilder.setRoutePlanner(routePlanner); 

      CloseableHttpClient httpclient = hcBuilder 
        .setSSLSocketFactory(sslsf).build(); 

      return httpclient; 
     } catch (Exception e) { 
      throw new RuntimeException(e); 
     } 
    } 
+0

Merci pour votre solution. Excusez-moi, quel est le 'constructeur' de la nouvelle SSLConnectionSocketFactory ( builder.build()) et 'bundle' de bundle.getString ("PROXY_HOST")? – Akira

+0

J'ai mis à jour le code pour inclure la méthode complète. Cela devrait aider. – Clement