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的支持的更多相关文章

  1. 咏南中间件增加HTTPS.SYS支持

    咏南中间件增加HTTPS.SYS支持 老客户可免费升级. HTTPS.SYS可以开发强大而稳定的REST SERVER. 微软在Windows Vista (server 2008) 以后使用http ...

  2. 在ASP.NET Core Web API中为RESTful服务增加对HAL的支持

    HAL(Hypertext Application Language,超文本应用语言)是一种RESTful API的数据格式风格,为RESTful API的设计提供了接口规范,同时也降低了客户端与服务 ...

  3. 使用PaxScript为Delphi应用增加对脚本的支持

    通过使用PaxScript可以为Delphi应用增加对脚本的支持. PaxScript支持paxC,paxBasic,paxPascle,paxJavaScript(对ECMA-262做了扩展) 四种 ...

  4. php增加对mysqli的支持

    php增加对mysqli的支持   我在fedora下使用yum安装的php和mysql,但是发现php不支持myslqi,只能编译一个mysqli的扩展给php用了. 方法如下: 1.下载php 2 ...

  5. HTTP实现长连接(TTP1.1和HTTP1.0相比较而言,最大的区别就是增加了持久连接支持Connection: keep-alive)

    HTTP实现长连接 HTTP是无状态的 也就是说,浏览器和服务器每进行一次HTTP操作,就建立一次连接,但任务结束就中断连接.如果客户端浏览器访问的某个HTML或其他类型的Web页中包含有其他的Web ...

  6. Jersey框架三:Jersey对HTTPS的支持

    Jersey系列文章: Jersey框架一:Jersey RESTful WebService框架简介 Jersey框架二:Jersey对JSON的支持 Jersey框架三:Jersey对HTTPS的 ...

  7. 如何在iOS上实现对HTTPS的支持(转)

    原文地址:http://blog.5ibc.net/p/101504.html 首先,需要明确你使用HTTP/HTTPS的用途,因为OSX和iOS平台提供了多种API,来支持不同的用途,官方文档< ...

  8. MyEclipse6.5增加对Tomcat7的支持

    MyEclipse6.5增加对Tomcat7的支持 最近在研究Servlet3.0,它是JavaEE6.0规范中的一部分 而Servlet3.0对服务器是有要求的,比如Tomcat7+(而Tomcat ...

  9. 开源即时通讯GGTalk 8.0发布,增加Linux客户端,支持在统信UOS、银河麒麟上运行!

    GGTalk在2021年推出7.0后,经过一年多时间的开发,终于推出8.0版本,实现了Linux客户端. 这几年,信创国产化的势头越来越猛,政府事企业单位都在逐步转向使用国产OS.国产CPU.国产数据 ...

随机推荐

  1. Netty代码分析

    转自:http://www.blogjava.net/BucketLi/archive/2010/12/28/332462.html Netty提供异步的.事件驱动的网络应用程序框架和工具,用以快速开 ...

  2. 书写优雅的shell脚本(插曲)- /proc/${pid}/status

    Linux中/proc/[pid]/status详细说明 博客分类: OS Linux多线程  [root@localhost ~]# cat /proc/self/status  Name: cat ...

  3. servlet 3 文件上传

    1.up.jsp <%@ page language="java" pageEncoding="utf-8"%> <form action=& ...

  4. UVaLive 3401 Colored Cubes (暴力)

    题意:给定n个立方体,让你重新涂尽量少的面,使得所有立方体都相同. 析:暴力求出每一种姿态,然后枚举每一种立方体的姿态,求出最少值. 代码如下: #pragma comment(linker, &qu ...

  5. PaaS服务之路漫谈(二)

    此文已由作者尧飘海授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 天下大势,分久必合,合久必分,社会历史的发展方向总有着惊人的相似.把这种规律应用到软件应用架构的发展方向上, ...

  6. E20170505-ms

    respectively adv. 分别,各自,顺序 为,依次为 encryption n.加密 corresponding adj. 符合的,相应的,相关的 correspond v. 通信,符合, ...

  7. 洛谷 - P1739 - 表达式括号匹配 - 模拟 - 栈

    https://www.luogu.org/problemnew/show/P1739 虽然应该是用栈的……但是直接模拟就可以了. #include<bits/stdc++.h> usin ...

  8. 自己动手搭建SSM

    1.工具 apache-tomcat 7 apache-maven(后面详细讲!这东西我一开始也很懵逼) mysql 5以上的版本 navicat(有了这个就不用cmd了,可以直接显示数据库,如下图, ...

  9. P5110 块速递推

    传送门 为啥我就没看出来有循环节呢-- 打表可得,这个数列是有循环节的,循环节为\(10^9+6\),然后分块预处理,即取\(k=sqrt(10^9+6)\),然后分别预处理出转移矩阵\(A\)的\( ...

  10. 大型系统的Redis性能优化

    问题描述 系统背景:大型线上Java服务集群(活跃用户数上千万),业务重度使用Redis存储个管理Session,业务并发量>1WQPS,基本上每个请求都需要访问Redis(可能是多次),使用了 ...