java httpClient访问https 跳过验证

2022年1月16日 4点热度 0条评论 来源: 月下旅人阿飞

在工作中需要java httpClient访问https地址时,报错,经过搜索解决,整合成工具类,内含两个方法如下:

/**
 * 绕过验证
 *
 * @return
 * @throws NoSuchAlgorithmException
 * @throws KeyManagementException
 */
public static SSLContext createIgnoreVerifySSL() throws NoSuchAlgorithmException, KeyManagementException {
    SSLContext sc = SSLContext.getInstance("SSLv3");

    // 实现一个X509TrustManager接口,用于绕过验证,不用修改里面的方法
    X509TrustManager trustManager = new X509TrustManager() {
        @Override
        public void checkClientTrusted(
            java.security.cert.X509Certificate[] paramArrayOfX509Certificate,
            String paramString) {
        }

        @Override
        public void checkServerTrusted(
            java.security.cert.X509Certificate[] paramArrayOfX509Certificate,
            String paramString) {
        }

        @Override
        public java.security.cert.X509Certificate[] getAcceptedIssuers() {
            return null;
        }
    };

    sc.init(null, new TrustManager[] { trustManager }, null);
    return sc;
}

/**
 * 模拟请求
 *
 * @param url		资源地址
 * @param map	参数列表
 * @param encoding	编码
 * @return
 * @throws NoSuchAlgorithmException
 * @throws KeyManagementException
 * @throws IOException
 * @throws ClientProtocolException
 */
public static String send(String url, Map<String,String> map, String encoding) throws KeyManagementException, NoSuchAlgorithmException, ClientProtocolException, IOException {
    String body = "";
    //采用绕过验证的方式处理https请求
    SSLContext sslcontext = createIgnoreVerifySSL();

    //创建自定义的httpclient对象
    SSLConnectionSocketFactory scsf = new SSLConnectionSocketFactory(sslcontext, NoopHostnameVerifier.INSTANCE);

    CloseableHttpClient httpclient = HttpClients.custom().setSSLSocketFactory(scsf).build();//		CloseableHttpClient client = HttpClients.createDefault();

    //创建post方式请求对象
    HttpPost httpPost = new HttpPost(url);

    //装填参数
    List<NameValuePair> nvps = new ArrayList<>();
    if(map!=null){
        for (Entry<String, String> entry : map.entrySet()) {
            nvps.add(new BasicNameValuePair(entry.getKey(), entry.getValue()));
        }
    }
    //设置参数到请求对象中
    httpPost.setEntity(new UrlEncodedFormEntity(nvps, encoding));

    System.out.println("请求地址:"+url);
    System.out.println("请求参数:"+ nvps);

    //设置header信息
    //指定报文头【Content-type】、【User-Agent】
    httpPost.setHeader("Content-type", "application/x-www-form-urlencoded");
    httpPost.setHeader("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)");

    //执行请求操作,并拿到结果(同步阻塞)
    CloseableHttpResponse response = httpclient.execute(httpPost);
    //获取结果实体
    HttpEntity entity = response.getEntity();
    if (entity != null) {
        //按指定编码转换结果实体为String类型
        body = EntityUtils.toString(entity, encoding);
    }
    EntityUtils.consume(entity);
    //释放链接
    response.close();
    return body;
}



参考资料:1.https://www.kancloud.cn/longxuan/httpclient-arron/117503
2.https://www.jianshu.com/p/e70ea8754506
    原文作者:月下旅人阿飞
    原文地址: https://www.cnblogs.com/a-traveler-under-the-moon/p/16159437.html
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系管理员进行删除。