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
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

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

(0)
上一篇 2022年3月6日 上午9:00
下一篇 2022年3月6日 上午10:00


相关推荐

  • docker dockerfile详解_docker指令

    docker dockerfile详解_docker指令前言Dockerfile是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。Dockerfile简介Dockerfile是用来构建Docker镜像的构建文件,是由一系列

    2022年8月6日
    9
  • java文件传输接口

    java文件传输接口跨系统的文件传输 上传 接口在系统开发中经常遇见在不同的系统 如安卓和 web 端 的文件上传 有两种方法 第一种 如果图片比较小可以采用 post 方式将图片转成 base64 的码放在 data 域中 以字符串传参的方式发送到指定的接口取出其值 多个就采用数组 这种一般试用与仅仅图片上传 且图片比较小大约 10kbz 左右太大了 base64 位比较都 http 传输数据太大 导致不能进入指定接口 第二种 采用

    2026年3月19日
    3
  • word怎么把编号变成文本格式_word字离序号特别远

    word怎么把编号变成文本格式_word字离序号特别远记录一下word如何去掉自动编号格式但保留原编号内容的方法:1.调出word的“开发工具”选项打开文件->选项->自定义功能区->选中开发工具->确定,2.编写宏依次点击:开发工具-宏-在“宏名”框内输入宏名(如:NumToTxt)-单击“创建”按钮,弹出VisualBasic编辑器窗口,窗口内自动出现以下内容把下面的这段代码复制下来:ActiveDocument.Content.ListFormat.ConvertNumbersToText粘.

    2025年6月2日
    4
  • OleDbDataAdapter 具体使用案例

    OleDbDataAdapter 具体使用案例usingSystem usingSystem Collections Generic usingSystem ComponentMod usingSystem Data usingSystem Data OleDb usingSystem Data SqlClient usingSystem Drawing usingSystem Linq

    2026年3月17日
    1
  • 红队评估实战靶场(1)

    0x00前言[滑稽][滑稽]又是我,我又来发水文了,这几天打靶机打上瘾了,再来更新篇靶机的文章0x01靶机渗透配置好靶机后,这里需要打开win7,来到c盘目录下启动phpstudy启动完成后

    2021年12月11日
    39
  • 计算机组成原理期末总结「建议收藏」

    文章目录写在前面计算机系统概论知识点习题运算方法和运算器知识点习题写在前面临近期末,总结了下知识点,供个人复习使用,仅供参考(近期不间断更新)。计算机系统概论知识点1.时钟周期是计算机中最基本的、最小的时间单位。在一个时钟周期内,CPU仅完成一个最基本的动作。2.主频(时钟频率):每秒钟含有多少个时钟周期(1.2GHz即每秒钟含有1.2×10^9个时钟周期)。3.CPI:一条指令所需要的时钟周期个数。4.MIPS:每秒钟能执行多少个100万条指令。5.MFLOPS:每秒百万次浮点操作次

    2022年4月12日
    56

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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