zoukankan      html  css  js  c++  java
  • 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);
            }
        }
    }
  • 相关阅读:
    Apache Flink教程
    开发EasyRTSPServer组件时如何使用ffserver搭建一套RTSP流媒体服务器并分发RTSP视频流?
    【解决方案】用科技的力量构筑“食品安全”防火墙,明厨亮灶保护“舌尖上的安全”
    RTSP/GB28181视频智能分析人脸识别系统EasyCVR除人脸门禁外还可以运用到哪些方向?
    GB28181/RTSP/SDK/Ehome协议安防视频融合平台EasyCVR新增分组管理功能操作介绍
    【解决方案】RTSP/GB28181协议视频平台EasyCVR在烟草行业是如何搭建一套网络视频监控系统的?
    【解决方案】RTSP/GB28181协议视频融合监控平台EasyCVR在三维可视化系统中的应用
    linux 学习随记---设置日志时间戳
    服务器端口总结
    (转载)PowerShell因为在此系统中禁止执行脚本解决方法
  • 原文地址:https://www.cnblogs.com/exmyth/p/14310013.html
Copyright © 2011-2022 走看看