java5增加对https的支持
jdk1.5不支持http协议,jdk1.8默认支持,比较好的解决方案是升级jdk,但是升级jdk风险极大。不能升级jdk的情况下,可以使用如下方式。
利用httpclient,进行封装,从而实现对https的get和post请求
import org.apache.commons.collections.MapUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.conn.ClientConnectionManager;
import org.apache.http.conn.scheme.Scheme;
import org.apache.http.conn.scheme.SchemeRegistry;
import org.apache.http.conn.ssl.SSLSocketFactory;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import java.util.ArrayList;
import java.util.List;
import java.util.Map; /**
* jdk1.5中没有封装好的包来请求https,所以这里做了一层封装,可以实现以下类型的请求
* http post
* http get
* https post
* https get
*
* @author qianhongwei
*/
public class HttpUtils {
private static final Logger logger = LoggerFactory.getLogger(HttpUtils.class); /**
* 定义类型,用于获取不同类型的httpclient
*/
enum CLIENT_TYPE {
HTTP, HTTPS
} /**
* https post请求
*
* @param url 请求地址
* @param headerMap 请求头信息
* @param contentMap 请求体信息
* @return 结果返回
*/
public static String httpsPost(String url, Map<String, String> headerMap, Map<String, String> contentMap) {
return httpsPost(url, headerMap, contentMap, "UTF-8");
} /**
* http post请求
*
* @param url 请求地址
* @param headerMap 请求头信息
* @param contentMap 请求体信息
* @return 结果返回
*/
public static String httpPost(String url, Map<String, String> headerMap, Map<String, String> contentMap) {
return httpPost(url, headerMap, contentMap, "UTF-8");
} /**
* https get请求
*
* @param url 请求地址
* @param paramMap 请求参数
* @return 结果返回
*/
public static String httpsGet(String url, Map<String, String> paramMap) {
return httpsGet(url, paramMap, "UTF-8");
} /**
* http get请求
*
* @param url 请求地址
* @param paramMap 请求参数
* @return 结果返回
*/
public static String httpGet(String url, Map<String, String> paramMap) {
return httpGet(url, paramMap, "UTF-8");
} /**
* @param url 请求地址
* @param headerMap 请求头信息
* @param contentMap 请求体信息
* @param charset 编码类型
* @return 结果返回
*/
public static String httpsPost(String url, Map<String, String> headerMap, Map<String, String> contentMap, String charset) {
return post(url, headerMap, contentMap, charset, CLIENT_TYPE.HTTPS);
} /**
* @param url 请求地址
* @param headerMap 请求头信息
* @param contentMap 请求体信息
* @param charset 编码类型
* @return 结果返回
*/
public static String httpPost(String url, Map<String, String> headerMap, Map<String, String> contentMap, String charset) {
return post(url, headerMap, contentMap, charset, CLIENT_TYPE.HTTP);
} /**
* @param url 请求地址
* @param paramMap 请求参数
* @param charset 编码类型
* @return 结果返回
*/
public static String httpsGet(String url, Map<String, String> paramMap, String charset) {
return get(url, paramMap, charset, CLIENT_TYPE.HTTPS);
} /**
* @param url 请求地址
* @param paramMap 请求参数
* @param charset 编码类型
* @return 结果返回
*/
public static String httpGet(String url, Map<String, String> paramMap, String charset) {
return get(url, paramMap, charset, CLIENT_TYPE.HTTP);
} /**
* post 请求的实际方法
*
* @param url 请求地址
* @param headerMap 请求头信息
* @param contentMap 请求体信息
* @param charset 编码类型
* @param type 协议类型
* @return 结果返回
*/
private static String post(String url, Map<String, String> headerMap, Map<String, String> contentMap, String charset, CLIENT_TYPE type) {
if (StringUtils.isBlank(url)) {
throw new RuntimeException("请求url为空");
} String result = null;
HttpClient httpClient = null;
try {
HttpPost post = new HttpPost(url);
if (MapUtils.isNotEmpty(headerMap)) {// 设置请求头
for (Map.Entry<String, String> entry : headerMap.entrySet()) {
post.addHeader(entry.getKey(), entry.getValue());
}
} if (MapUtils.isNotEmpty(contentMap)) {// 设置请求体
List<NameValuePair> content = getNameValuePairList(contentMap);
UrlEncodedFormEntity entity = new UrlEncodedFormEntity(content, charset);
post.setEntity(entity);
} httpClient = getClient(type);//这里是重点,根据不同协议获取不同类型的client端
HttpResponse response = httpClient.execute(post);//发送请求并接收返回数据
if (response != null) {
HttpEntity resEntity = response.getEntity();
if (resEntity != null) {
result = EntityUtils.toString(resEntity, charset);
}
}
return result;
} catch (Exception ex) {
throw new RuntimeException("请求:" + url + " 异常:" + ex.getMessage());
} finally {
try {
if (null != httpClient && null != httpClient.getConnectionManager()) {
httpClient.getConnectionManager().shutdown();
}
} catch (Exception e) {
logger.error("请求:" + url + " 流关闭异常或者httpclient关闭异常");
}
}
} /**
* get 请求的实际方法
*
* @param url 请求地址
* @param paramMap 请求参数
* @param charset 编码类型
* @param type 协议类型
* @return 结果返回
*/
private static String get(String url, Map<String, String> paramMap, String charset, CLIENT_TYPE type) {
if (StringUtils.isBlank(url)) {
throw new RuntimeException("请求url为空");
} String result = null;
HttpClient httpClient = null;
try {
if (MapUtils.isNotEmpty(paramMap)) {// 拼接参数
// 设置请求体
List<NameValuePair> content = getNameValuePairList(paramMap);
UrlEncodedFormEntity entity = new UrlEncodedFormEntity(content, charset);
String params = EntityUtils.toString(entity);
url = url + "?" + params;
} HttpGet get = new HttpGet(url);
httpClient = getClient(type);
HttpResponse response = httpClient.execute(get); //发送请求并接收返回数据
if (response != null) {
HttpEntity resEntity = response.getEntity();
if (resEntity != null) {
result = EntityUtils.toString(resEntity, charset);
}
}
return result;
} catch (Exception ex) {
throw new RuntimeException("请求:" + url + " 异常:" + ex.getMessage());
} finally {
try {
if (null != httpClient && null != httpClient.getConnectionManager()) {
httpClient.getConnectionManager().shutdown();
}
} catch (Exception e) {
logger.error("请求:" + url + " 流关闭异常或者httpclient关闭异常");
}
}
} private static List<NameValuePair> getNameValuePairList(Map<String, String> paramMap) {
List<NameValuePair> content = null;
if (MapUtils.isNotEmpty(paramMap)) {
// 设置请求体
content = new ArrayList<NameValuePair>();
for (Map.Entry<String, String> entry : paramMap.entrySet()) {
content.add(new BasicNameValuePair(entry.getKey(), entry.getValue()));
}
}
return content;
} /**
* 根据指定类型返回http、https类型的客户端
*
* @param type 类型
* @return 客户端
* @throws Exception 异常信息
*/
private static DefaultHttpClient getClient(CLIENT_TYPE type) throws Exception {
if (type == CLIENT_TYPE.HTTP) {//http类型
return new DefaultHttpClient();
} else if (type == CLIENT_TYPE.HTTPS) {//https类型
return new SSLClient();
} else {
throw new RuntimeException("未知协议类型,请重新指定");
}
} /**
* 自定义SSL client
*/
static class SSLClient extends DefaultHttpClient {
public SSLClient() throws Exception {
super();
X509TrustManager tm = new X509TrustManager() {
@Override
public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
} @Override
public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
} @Override
public X509Certificate[] getAcceptedIssuers() {
return null;
}
};
//传输协议需要根据自己的判断
//SSLContext ctx = SSLContext.getInstance("TLSv1.2");
SSLContext ctx = SSLContext.getInstance("TLS");
ctx.init(null, new TrustManager[]{tm}, null);
SSLSocketFactory ssf = new SSLSocketFactory(ctx, SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
ClientConnectionManager ccm = this.getConnectionManager();
SchemeRegistry sr = ccm.getSchemeRegistry();
sr.register(new Scheme("https", 443, ssf));
}
} public static void main(String[] args) {
//Map<String, String> param = new HashMap<String, String>();
//param.put("fr", "aladdin");
//String result = httpsGet("https://baike.baidu.com/item/%E5%89%81%E6%A4%92%E9%B1%BC%E5%A4%B4/1171373", param); //String result = httpsGet("https://baike.baidu.com/item/%E5%89%81%E6%A4%92%E9%B1%BC%E5%A4%B4/1171373?fr=aladdin", null);
//String result = httpGet("http://www.baidu.com",null); //System.out.println(result);
} }
java5增加对https的支持的更多相关文章
- 咏南中间件增加HTTPS.SYS支持
咏南中间件增加HTTPS.SYS支持 老客户可免费升级. HTTPS.SYS可以开发强大而稳定的REST SERVER. 微软在Windows Vista (server 2008) 以后使用http ...
- 在ASP.NET Core Web API中为RESTful服务增加对HAL的支持
HAL(Hypertext Application Language,超文本应用语言)是一种RESTful API的数据格式风格,为RESTful API的设计提供了接口规范,同时也降低了客户端与服务 ...
- 使用PaxScript为Delphi应用增加对脚本的支持
通过使用PaxScript可以为Delphi应用增加对脚本的支持. PaxScript支持paxC,paxBasic,paxPascle,paxJavaScript(对ECMA-262做了扩展) 四种 ...
- php增加对mysqli的支持
php增加对mysqli的支持 我在fedora下使用yum安装的php和mysql,但是发现php不支持myslqi,只能编译一个mysqli的扩展给php用了. 方法如下: 1.下载php 2 ...
- HTTP实现长连接(TTP1.1和HTTP1.0相比较而言,最大的区别就是增加了持久连接支持Connection: keep-alive)
HTTP实现长连接 HTTP是无状态的 也就是说,浏览器和服务器每进行一次HTTP操作,就建立一次连接,但任务结束就中断连接.如果客户端浏览器访问的某个HTML或其他类型的Web页中包含有其他的Web ...
- Jersey框架三:Jersey对HTTPS的支持
Jersey系列文章: Jersey框架一:Jersey RESTful WebService框架简介 Jersey框架二:Jersey对JSON的支持 Jersey框架三:Jersey对HTTPS的 ...
- 如何在iOS上实现对HTTPS的支持(转)
原文地址:http://blog.5ibc.net/p/101504.html 首先,需要明确你使用HTTP/HTTPS的用途,因为OSX和iOS平台提供了多种API,来支持不同的用途,官方文档< ...
- MyEclipse6.5增加对Tomcat7的支持
MyEclipse6.5增加对Tomcat7的支持 最近在研究Servlet3.0,它是JavaEE6.0规范中的一部分 而Servlet3.0对服务器是有要求的,比如Tomcat7+(而Tomcat ...
- 开源即时通讯GGTalk 8.0发布,增加Linux客户端,支持在统信UOS、银河麒麟上运行!
GGTalk在2021年推出7.0后,经过一年多时间的开发,终于推出8.0版本,实现了Linux客户端. 这几年,信创国产化的势头越来越猛,政府事企业单位都在逐步转向使用国产OS.国产CPU.国产数据 ...
随机推荐
- dict built-in function
映射类型:字典 字典是无序的,映射类型对象里哈希值和被指向的对象是一对多的关系,字典中的键必须是可哈希的,所有不可变的类型都是可哈希的,另外针对数字键来说,值相等的两个数字是相同的键,例如1和1.0: ...
- STL Algorithms 之 unique
C++的文档中说,STL中的unique是类似于这样实现的: template <class ForwardIterator> ForwardIterator unique ( Forwa ...
- codeforces 690D1 D1. The Wall (easy)(dfs)
题目链接: D1. The Wall (easy) time limit per test 0.5 seconds memory limit per test 256 megabytes input ...
- 实现自定义xib和storyboard的加载,
一:加载xib 1.分别创建xib,.h .m文件继承自UIView. 在xib上绑定类名. 或者创建文件的时候直接勾选xib 2.在控制器中调用类方法 jyq52787网盘/ios/潭州学院/iO ...
- java -- 虚拟机和内存
从大方向来分:栈内存,堆内存,方法区,本地方法栈,程序计数器 java从存储数据的角度来分: 寄存器(register):最快的存储区,由编译器根据需求进行分配,不由认为控制. 堆栈(statck): ...
- noip2010引水入城
https://www.zybuluo.com/ysner/note/1334997 这道题fst了 题面 戳我 解析 我一开始的想法是,按照高度给第一行排序,然后贪心地选取目前到不了的,高度最高的第 ...
- Backbone.js之model篇(一)
Backbone.js之model篇(一) Backbone 是一个前端 JS 代码 MVC 框架,它不可取代 Jquery,不可取代现有的 template 库.而是和这些结合起来构建复杂的 web ...
- Oracle的db.properties文件
转自:https://blog.csdn.net/lssqk/article/details/79133829
- linux下ping不通的解决方法
转自:https://blog.csdn.net/weixin_33400820/article/details/80227702 今天在做练习的时候,发现如何都无法ping通外网,在经过各种网络求助 ...
- mysite-exampleservice和mysite-vsg
可能找到了这两个nova安装的地方,下午分析 搜素site_name test 这条线 cord-compute-maas-playbook这条线 这个可以作为验证