RestTemplate HttpClient詳解及如何設置忽略SSL


@Configuration
public class ScheduleRestConfigurer {
    @Bean
    public RestTemplate restTemplate() {
        RestTemplate restTemplate = new RestTemplate(httpRequestFactory());

        FormHttpMessageConverter formConverter = new FormHttpMessageConverter();
        restTemplate.getMessageConverters().add(formConverter);
        restTemplate.getMessageConverters().add(new JacksonConverter());
        return restTemplate;
    }

    @Bean
    public ClientHttpRequestFactory httpRequestFactory() {
        return new HttpComponentsClientHttpRequestFactory(httpClient());
    }

    @Bean
    public HttpClient httpClient() {
        //設置協議http和https對應的處理socket鏈接工廠的對象
        Registry<ConnectionSocketFactory> registry = RegistryBuilder.<ConnectionSocketFactory>create()
                .register("http", PlainConnectionSocketFactory.getSocketFactory())
                .register("https", sslConnectionSocketFactory())
                .build();
        PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager(registry);

        int maxTotal = 100;
        int defaultMaxPerRoute = 20;
        int validateAfterInactivity = 10000;
        int socketTimeout = 30000;
        int connectTimeout = 30000;
        int connectionRequestTimeout = 30000;
        connectionManager.setMaxTotal(maxTotal); // 最大連接數
        connectionManager.setDefaultMaxPerRoute(defaultMaxPerRoute);    //單個路由最大連接數
        connectionManager.setValidateAfterInactivity(validateAfterInactivity); // 最大空間時間

        RequestConfig requestConfig = RequestConfig.custom()
                .setSocketTimeout(socketTimeout)        //服務器返回數據(response)的時間,超過拋出read timeout
                .setConnectTimeout(connectTimeout)      //連接上服務器(握手成功)的時間,超出拋出connect timeout
                // .setStaleConnectionCheckEnabled(staleConnectionCheckEnabled) // 提交前檢測是否可用
                .setConnectionRequestTimeout(connectionRequestTimeout)//從連接池中獲取連接的超時時間,超時間未拿到可用連接,會拋出org.apache.http.conn.ConnectionPoolTimeoutException: Timeout waiting for connection from pool
                .build();

        return HttpClientBuilder.create()
                .setDefaultRequestConfig(requestConfig)
                .setConnectionManager(connectionManager)
                .setConnectionManagerShared(false)
                .evictIdleConnections(3000, TimeUnit.MILLISECONDS)
                //默認重試3次 會從連接池中獲取 不會直接創建新的連接 此處不允許重試
                .disableAutomaticRetries()
                .build();
    }

    @Bean
    public SSLConnectionSocketFactory sslConnectionSocketFactory() {
        SSLConnectionSocketFactory sslsf;
        try {
            SSLContextBuilder builder = SSLContexts.custom();
            builder.loadTrustMaterial(null, new TrustStrategy() {
                @Override
                public boolean isTrusted(X509Certificate[] chain, String authType) {
                    return true;
                }
            });

            SSLContext sslContext = builder.build();
            sslsf = new SSLConnectionSocketFactory(
                    sslContext, new X509HostnameVerifier() {
                @Override
                public void verify(String host, SSLSocket ssl)
                        throws IOException {
                }

                @Override
                public void verify(String host, X509Certificate cert)
                        throws SSLException {
                }

                @Override
                public void verify(String host, String[] cns,
                                   String[] subjectAlts) throws SSLException {
                }

                @Override
                public boolean verify(String s, SSLSession sslSession) {
                    return true;
                }
            });
            return sslsf;
        } catch (Exception e) {
            return null;
        }
    }

    public class JacksonConverter extends MappingJackson2HttpMessageConverter {
        public JacksonConverter(){
            List<MediaType> mediaTypes=new ArrayList<>();
            //添加text/html類型的支持
            mediaTypes.add(MediaType.TEXT_HTML);
            //添加text/plain類型的支持.微信接口會用到
            mediaTypes.add(MediaType.TEXT_PLAIN);
            setSupportedMediaTypes(mediaTypes);
        }
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM