2017-10-20 6 views
0

자바 크롤러를 작성하고 proxy을 사용하고 어떤 https certification도 무시해보십시오.UnsupportedOperationException이있는 내부 HttpClient.getParams()

그러나이 작동하지 않습니다는 (org.apache.http.impl.client.InternalHttpClient.getParams에서)

java.lang.UnsupportedOperationException가

와 나는 대부분 말할 솔루션을 검색 내 HttpClient의 버전은 오래되었지만 아파치 웹 사이트에서 최신 버전으로 업데이트합니다.이 예외는 여전히 발생했습니다.

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(); 
    } 
} 

감사합니다 모든 솔루션에 대한 많은 :

다음 코드는 내 크롤러 코드입니다.

답변

0

나는 동일한 문제가 있었으며 최신 버전에서는 사용할 수 없기 때문에이 문제가 발생했습니다.

나는 아래의 코드를 시도하고 당신의 솔루션을 나를 위해

 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

감사했다. 실례합니다. 새로운 SSLConnectionSocketFactory ( builder.build())의 '빌더'와 bundle.getString ("PROXY_HOST")의 'bundle'은 무엇을 의미합니까? – Akira

+0

전체 메소드를 포함하도록 코드를 업데이트했습니다. 도움이 될 것입니다. – Clement