HttpClient的ssl方式发送请求

2023-11-06

最近因为项目需要,需要以rest方式和第三方平台交互,由于需要ssl方式连接,所以记录一下:

maven依赖如下:

        <dependency>
			<groupId>org.apache.httpcomponents</groupId>
			<artifactId>httpclient</artifactId>
			<version>4.5.3</version>
		</dependency>

这里介绍两种ssl连接方式,一种是ssl信任所有的证书(基本上也就是没有安全性保证),另一种是ssl的正常使用(需要证书认证的)
首先是一个工具类


2019/4/3补充,前段时间,部署到生产环境后发生了一点问题,观察服务器日志(websphere)发现是报告线程挂起,通过查询google,发现是因为建立http连接后,没有关闭资源 ,造成资源耗尽,今天重新编辑此文

主要 增加了资源池对象 HttpClientConnectionManager

import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;

import javax.net.ssl.X509TrustManager;

public class HttpsTrustManager implements X509TrustManager {

	@Override
	public void checkClientTrusted(X509Certificate[] arg0, String arg1)
			throws CertificateException {
		// TODO Auto-generated method stub

	}

	@Override
	public void checkServerTrusted(X509Certificate[] arg0, String arg1)
			throws CertificateException {
		// TODO Auto-generated method stub

	}

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

}

正常SSL方式(需要证书)的工厂类

package com.haitaiinc.orionmonitor.util;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.security.KeyManagementException;
import java.security.KeyStore;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.cert.CertificateException;
import java.util.Map;

import javax.net.ssl.SSLContext;

import org.apache.http.conn.HttpClientConnectionManager;
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.apache.http.conn.ssl.SSLContexts;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
/**
 * 构建httpclient的
 * @author Think
 *
 */
public class HttpClientFactory {

	
		
	private static CloseableHttpClient client;
	//连接池 
	private static  HttpClientConnectionManager poolingConnManager = new PoolingHttpClientConnectionManager();
	
	
	  /**
     * 获取需要安全认证的httpClient的实例
     * @Title: getHttpsClient 
     * @Description: TODO
     * @Author: Think
     * @Date :Jan 16, 2019
     * @return: HttpClient
     */
    public static CloseableHttpClient getHttpsClient() throws Exception {

        if (client != null) {
            return client;
        }
        SSLContext sslcontext = getSSLContext();
        SSLConnectionSocketFactory factory = new SSLConnectionSocketFactory(sslcontext,
                SSLConnectionSocketFactory.BROWSER_COMPATIBLE_HOSTNAME_VERIFIER);
        
        client = HttpClients.custom().setConnectionManager(poolingConnManager).setSSLSocketFactory(factory).build();

        return client;
    }

    private static SSLContext getSSLContext() throws KeyStoreException, 
    NoSuchAlgorithmException, CertificateException, IOException, KeyManagementException {
        KeyStore trustStore  = KeyStore.getInstance(KeyStore.getDefaultType());
        
        Map<String, String> map = ParseSSLUtil.getInterfaceConfig();
        String keyLocation = map.get("keystore");
        
        FileInputStream instream = new FileInputStream(new File(keyLocation));
        try {
            trustStore.load(instream, "changeit".toCharArray());
        } finally {
            instream.close();
        }
        return SSLContexts.custom()
                .loadTrustMaterial(trustStore)
                .build();
    }
    
    public static void releaseInstance() {
        client = null;
    }
    
    
}


不安全的SSL方式的工厂类

package com.haitaiinc.orionmonitor.util;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.security.KeyManagementException;
import java.security.KeyStore;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.security.cert.CertificateException;

import javax.net.ssl.SSLContext;
import javax.net.ssl.X509TrustManager;

import org.apache.http.client.HttpClient;
import org.apache.http.conn.HttpClientConnectionManager;
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.apache.http.conn.ssl.SSLContexts;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;

public class HttpClientFactoryWithNoSSL {

	private static CloseableHttpClient client;
	
	
	//连接池 
	private static  HttpClientConnectionManager poolingConnManager = new PoolingHttpClientConnectionManager();
    /**
	 * 获取不需要ssl认证的httpClient实例
	 * @Title: getHttpsClientWithNoCert 
	 * @Description: TODO
	 * @Author: Think
	 * @Date :Jan 16, 2019
	 * @return: HttpClient
	 */
    public static HttpClient getHttpsClient() throws Exception {

        if (client != null) {
            return client;
        }
        SSLContext sslcontext = SSLContexts.custom().useSSL().build();
        sslcontext.init(null, new X509TrustManager[]{new HttpsTrustManager()}, new SecureRandom());
        SSLConnectionSocketFactory factory = new SSLConnectionSocketFactory(sslcontext,
                SSLConnectionSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
        client = HttpClients.custom().setConnectionManager(poolingConnManager).setSSLSocketFactory(factory).build();

        return client;
    }

    public static void releaseInstance() {
        client = null;
    }
}


使用样例:

     
    	

        //获取httpclient客户端
    	CloseableHttpClient httpsClient = HttpClientFactory.getHttpsClient();
    	//因为需要认证就是需要将{用户名:密码}变成字节数组并base64编码
		byte[] admin= ParseSSLUtil.getUserTokenString().getBytes();
		String encoding = ParseSSLUtil.encodeBase64(admin);
		
		//内存使用情况
		HttpGet httpGet = new HttpGet(config.get("url").concat("/api/statistics/memoryusage"));
		
		httpGet.addHeader("Content-Type", "application/json");
		httpGet.setHeader("Authorization", "Basic " + encoding);
		String mem = "";
		CloseableHttpResponse responseMem = null;
		CloseableHttpResponse responseCPU = null;
		CloseableHttpResponse responseDisk = null;
		try {
			responseMem = httpsClient.execute(httpGet);
			if(responseMem.getStatusLine().getStatusCode()!=HttpStatus.SC_OK){
				mem = "0";
			}else{
				HttpEntity entity = responseMem.getEntity();
				if(entity != null){
		            mem = EntityUtils.toString(entity,"UTF-8");
		        }
				EntityUtils.consume(entity);//要消耗消息实体,这是必须步骤
			}
		} catch (Exception e1) {
			e1.printStackTrace();
			mem = "0";
		}finally{
			responseMem.close();//尝试关闭资源,将socket连接返回给资源池
		}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

HttpClient的ssl方式发送请求 的相关文章

随机推荐

  • maven报错‘has elapsed or updates are forced“

    使用 U强制更新参数运行maven命令
  • 少儿机器人编程有什么用

    少儿机器人编程有什么用 小孩的学习一直以来都是家长们非常关心和重视的一件事情 很多的家长在培养孩子的学习方面也可以说是相当的耐心的 会给孩子选择一些能更有利于孩子成长的课程 就拿现在很多的家长想要孩子去学习机器人编程的课程来说 有的家长对于
  • 解决Enter passphrase for key

    两种解决方案 提示 Permissions 0644 for ssh id rsa pub are too open 解决方法 使用chmod 0600 ssh id rsa pub更改将公钥权限改成 600 提示 Enter passph
  • Java中的静态变量&静态方法

    静态变量 静态方法 静态变量又叫做类变量 静态方法又被称为类方法 均被static修饰 未被static修饰的成员变量和方法分别被称为实例变量和实例方法 1 静态方法中不需要它所属类的任何实例就可以访问 所以在静态方法中不可以使用this关
  • Swift语法学习--运算符与流程控制

    文章目录 运算符 循环 条件 预处理器指令 运算符 普通的运算符加减乘除 与或非 三元运算我觉得没必要再赘述了 就记录一下我不熟悉的 循环 条件 预处理器指令
  • SQL Server 数据库中添加文件组和数据文件

    SQL Server 现有数据库中添加文件组和数据文件 use CURRENT DB 进入当前操作数据库 go alter database CURRENT DB add filegroup FG1 向CURRENT DB 数据库添加FG1
  • idea安装插件plugin(主要针对网络连接不上的情况)

    STEP1 ctrl alt s 打开settings STEP2 在输入框键入 Plugins STEP3 输入你想要的插件名称 我这边输入的是nodejs 因为最近在学 我这边是安装过的 所以这样显示 STEP4 点开中下方的前两个按钮
  • 在windows下编译glib库

    glib库是跨平台的C语言函数库 是Gtk 库和Gnome的基础 glib可以在多个平台下使用 比如Linux Unix Windows等 glib为许多标准的 常用的C语言结构提供了相应的替代物 先从官网下载下载 https downlo
  • Linux网络通信总结

    网络IO之阻塞 非阻塞 同步 异步 单播 多播 组播 广播 多路复用POLL SELECT epoll 超时 read write accept connect 超时 实现 1 用select来设置超时机制 2 使用setsockopt 函
  • React 子向父级组件通信时,state为旧的数据

    问题描述 当嵌套太深的子组件触发更新父组件时 父组件获取到的state map传入子组件 是旧的 问题场景 初始子组件仅为1个Input输入框 新增后有2个Input输入框 此时触发222输入框的修改 通知上级组件保存修改的内容时 父组件存
  • 数据结构—单链表C语言刷题2

    目录 1 链表分割 2 链表的回文结构 3 相交链表 4 环形链表 5 环形链表II 1 链表分割 题目链接 链表分割 题目描述 现有一链表的头指针 ListNode pHead 给一定值x 编写一段代码将所有小于x的结点排在其余结点之前
  • Debug下出现debug assertion failed

    出现debug assertion failed界面后点击重试跳到这句ASSERT m hObject NULL 采用注释查找错误的方式定位至 if CFrameWnd OnCreate lpCreateStruct 1 return 1
  • 获取referer中的请求参数_Http请求头中的referer

    Referer是 HTTP请求header 的一部分 当浏览器 或者模拟浏览器行为 向web 服务器发送请求的时候 头信息里有包含 Referer 比如我在www google com 里有一个www baidu com 链接 那么点击这个
  • 在Linux内核中添加自己的驱动程序

    就说一下怎么添加进去吧 首先你要把驱动程序写好 我已添加 首先在drivers目录下面创建GPIO文件夹 文件夹下面创建三个文件 分别是 gpio c Kconfig Makefile 三个文件 gpio c是你的驱动程序 Kconfig是
  • Spring复习笔记

    1 Spring 1 1 简介 优点 Spring是一个轻量级控制反转 IoC 和面向切面 AOP 的容器 轻量级 低侵入 松耦合 框架粘合剂 更容易整合其他框架 支持事务处理 官网 https spring io projects spr
  • 不怕死就上这些网站

    1 hxxp www dj3344 com 打开后 重启时你的主页就变成它的 并通过QQ向他人传播 现在正飙行 奇坏无比 2 hxxp www qq168 net 打开后 重启时你的主页就变成它的 并通过QQ向他人传播 而且传波病毒 还狠些
  • 我的GIT练习Four

    目录 前言 GIT安装教程 Git作者 GIT优点 GIT缺点 为什么要使用 Git GIT练习Four C1 初始化项目 C2 设计项目首页 C3 设计登录页面 C4 实现登录功能 C5 设计后台页面 C6 设计注册页面 C7 实现注册功
  • 拼搏百天!上月喜获阿里内推,交叉面把面试官面傻眼了

    阿里内推一面 项目 1 面试官让我描述一个自己印象最深的项目 手画设计图 2 针对项目中的技术进行发问 比如 架构设计 部署图 模块之间的通信等 3 因为我描述项目存储数据比较多 让我重新设计数据库的表 怎么设计 后面都是针对项目技术的问题
  • iOS 蓝牙扫描枪扫描内容不正确

    背景 在移动设备上 使用蓝牙扫描枪 相当于接入了一下外接键盘 我们的客户使用我们的App 并连接蓝牙扫码枪 将扫描的内容传输到我们的App中 App再做出对应的响应 举个例子 较为常见的应用场景就是 拣货员拿着扫码枪 扫描产品上的UPC码
  • HttpClient的ssl方式发送请求

    最近因为项目需要 需要以rest方式和第三方平台交互 由于需要ssl方式连接 所以记录一下 maven依赖如下