httpclient访问https

httpclient访问https

大家好,又见面了,我是全栈君。

本文从spring cloud netflix zuul里头摘出httpclient访问https/http的源码,展示一下怎么用httpclient去访问https。

newConnectionManager

protected PoolingHttpClientConnectionManager newConnectionManager(boolean sslHostnameValidationEnabled) {
        try {
            final SSLContext sslContext = SSLContext.getInstance("SSL");
            sslContext.init(null, new TrustManager[] { new X509TrustManager() {
                @Override
                public void checkClientTrusted(X509Certificate[] x509Certificates,
                                               String s) throws CertificateException {
                }

                @Override
                public void checkServerTrusted(X509Certificate[] x509Certificates,
                                               String s) throws CertificateException {
                }

                @Override
                public X509Certificate[] getAcceptedIssuers() {
                    return null;
                }
            } }, new SecureRandom());

            RegistryBuilder<ConnectionSocketFactory> registryBuilder = RegistryBuilder
                    .<ConnectionSocketFactory> create()
                    .register("http", PlainConnectionSocketFactory.INSTANCE);
            if (sslHostnameValidationEnabled) {
                registryBuilder.register("https",
                        new SSLConnectionSocketFactory(sslContext));
            }
            else {
                registryBuilder.register("https", new SSLConnectionSocketFactory(
                        sslContext, NoopHostnameVerifier.INSTANCE));
            }
            final Registry<ConnectionSocketFactory> registry = registryBuilder.build();

            PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager(registry);
            connectionManager
                    .setMaxTotal(200);
            connectionManager.setDefaultMaxPerRoute(20);
            return connectionManager;
        }
        catch (Exception ex) {
            throw new RuntimeException(ex);
        }
    }

其中sslHostnameValidationEnabled指定要不要检验ssl,如果不校验,则是使用NoopHostnameVerifier

@Contract(threading = ThreadingBehavior.IMMUTABLE)
public class NoopHostnameVerifier implements HostnameVerifier {

    public static final NoopHostnameVerifier INSTANCE = new NoopHostnameVerifier();

    @Override
    public boolean verify(final String s, final SSLSession sslSession) {
        return true;
    }

    @Override
    public final String toString() {
        return "NO_OP";
    }

}

newClient

final RequestConfig requestConfig = RequestConfig.custom()
                .setSocketTimeout(60000)
                .setConnectTimeout(60000)
                .setCookieSpec(CookieSpecs.IGNORE_COOKIES).build();
        HttpClientBuilder httpClientBuilder = HttpClients.custom();
        httpClientBuilder.setSSLHostnameVerifier(NoopHostnameVerifier.INSTANCE);
        HttpClient httpclient = httpClientBuilder.setConnectionManager(newConnectionManager(false))
                .useSystemProperties().setDefaultRequestConfig(requestConfig)
                .setRetryHandler(new DefaultHttpRequestRetryHandler(0, false))
                .setRedirectStrategy(new RedirectStrategy() {
                    @Override
                    public boolean isRedirected(HttpRequest request,
                                                HttpResponse response, HttpContext context)
                            throws ProtocolException {
                        return false;
                    }

                    @Override
                    public HttpUriRequest getRedirect(HttpRequest request,
                                                      HttpResponse response, HttpContext context)
                            throws ProtocolException {
                        return null;
                    }
                }).build();

request

HttpRequest httpRequest = new BasicHttpRequest("GET","/api/data");
        HttpHost httpHost = new HttpHost("demo.com.cn",-1,"https");
        try{
            return httpClient.execute(httpHost, httpRequest);
//            System.out.println(response.getEntity().getContent());
        }catch (Exception e){
            e.printStackTrace();
        }

小结

  • 使用NoopHostnameVerifier不去验证ssl,但是可能存在风险
  • 构造X509TrustManager
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/108232.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • Swift4 String截取字符串

    Swift4 String截取字符串varstr1="AlexanderYeah";//1截取字符串的第一种方式//prefix截取前3个字符串varstr2=str1.prefix(3);print(str2);//suffix截取后3个字符串varstr3=str1.suffix(3);print(str3);//2截取一个范围的字符串//从0开始到倒数第二位结…

  • 电阻和电容的识别_电容电阻怎么区分

    电阻和电容的识别_电容电阻怎么区分一、贴片电阻阻值的读法贴片电阻的阻值通常以数字形式直接标注在电阻的表面,所以读电阻的阻值直接看电阻表面的数字即可。通常情况下有三种表示方法:(1)、由三个数字组成,表明电阻的误差是±5%。前面两位是有效数字,第三位数字表示乘零的倍数,即10的几次方,基本单位是Ω。例如:103,1和0是有效数字直接写下来即可,3表示乘零倍率,也就是10的2次方,所以103表示的阻值就是1010^3=1010…

  • 进程的基本状态及转换和阻塞及挂起的理解[通俗易懂]

    进程的基本状态及转换和阻塞及挂起的理解[通俗易懂]概念描述:就绪状态:一个进程获得了除处理机外的一切所需资源,一旦得到处理机即可运行,则称此进程处于就绪状态。执行状态:当一个进程在处理机上运行时,则称该进程处于运行状态。阻塞状态:一个进程正在等待某一事件发生(例如请求I/O而等待I/O完成等)而暂时仃止运行,这时即使把处理机分配给进程也无法运行,故称该进程处于阻塞状态。挂起状态:由于IO的速度慢于CPU的运算速度,经常出现CPU等待…

    2022年10月25日
  • php sigpipe,遭遇SIGPIPE[转]

    php sigpipe,遭遇SIGPIPE[转]转自:http://www.diybl.com/course/3_program/c++/cppjs/20090831/173152.html我写了一个服务器程序,在Windows下在cygwin环境编译后执行,然后用C#写了多线程客户端进行压力测试.程序一直运行正常.但当在Linux下测试时,总是莫名退出.最后跟踪到是write调用导致退出.用gdb执行程序,退出时提示”Broken…

  • 学习Spark的入门教程——《Spark大数据实例开发教程》

    学习Spark的入门教程——《Spark大数据实例开发教程》去年年底出的一本学习Spark大数据的教程,文笔上言简意赅,只讲最常用的内容,很适合入门学习。是面向Spark开发者的一本实用参考书,结合实例全面系统的介绍了Spark工具的开发与使用。全书包括五章内容,第一章介绍Spark生态圈以及SparkRDD的编程模型等内容;第二章介绍SparkRDD实战案例与解析,包含Spark应用程序的部署、Spark的各种应用案例与解析、…

  • Linux解压tar.gz和tar.bz2的命令「建议收藏」

    Linux解压tar.gz和tar.bz2的命令「建议收藏」两者的命令主要是参数的不同,解压tar.gz和tar.bz2不同压缩文件的命令如下:  1解压tar.gz文件tar-zxvf×××.tar.gz  2解压tar.bz2文件tar-jxvf×××.tar.bz2  -z:是否同时具有gzip的属性?亦即是否需要用gzip压缩?  -j:是否同时具有bzip2的属性?亦即是否需要用bzip2压缩?

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号