百木园-与人分享,
就是让自己快乐。

java httpClient访问https 跳过验证

在工作中需要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
本站部分图文来源于网络,如有侵权请联系删除。

未经允许不得转载:百木园 » java httpClient访问https 跳过验证

相关推荐

  • 暂无文章