jdk1.5不支持http协议,jdk1.8默认支持,比较好的解决方案是升级jdk,但是升级jdk风险极大。不能升级jdk的情况下,可以使用如下方式。

利用httpclient,进行封装,从而实现对https的get和post请求

  1. import org.apache.commons.collections.MapUtils;
  2. import org.apache.commons.lang3.StringUtils;
  3. import org.apache.http.HttpEntity;
  4. import org.apache.http.HttpResponse;
  5. import org.apache.http.NameValuePair;
  6. import org.apache.http.client.HttpClient;
  7. import org.apache.http.client.entity.UrlEncodedFormEntity;
  8. import org.apache.http.client.methods.HttpGet;
  9. import org.apache.http.client.methods.HttpPost;
  10. import org.apache.http.conn.ClientConnectionManager;
  11. import org.apache.http.conn.scheme.Scheme;
  12. import org.apache.http.conn.scheme.SchemeRegistry;
  13. import org.apache.http.conn.ssl.SSLSocketFactory;
  14. import org.apache.http.impl.client.DefaultHttpClient;
  15. import org.apache.http.message.BasicNameValuePair;
  16. import org.apache.http.util.EntityUtils;
  17. import org.slf4j.Logger;
  18. import org.slf4j.LoggerFactory;
  19.  
  20. import javax.net.ssl.SSLContext;
  21. import javax.net.ssl.TrustManager;
  22. import javax.net.ssl.X509TrustManager;
  23. import java.security.cert.CertificateException;
  24. import java.security.cert.X509Certificate;
  25. import java.util.ArrayList;
  26. import java.util.List;
  27. import java.util.Map;
  28.  
  29. /**
  30. * jdk1.5中没有封装好的包来请求https,所以这里做了一层封装,可以实现以下类型的请求
  31. * http post
  32. * http get
  33. * https post
  34. * https get
  35. *
  36. * @author qianhongwei
  37. */
  38. public class HttpUtils {
  39. private static final Logger logger = LoggerFactory.getLogger(HttpUtils.class);
  40.  
  41. /**
  42. * 定义类型,用于获取不同类型的httpclient
  43. */
  44. enum CLIENT_TYPE {
  45. HTTP, HTTPS
  46. }
  47.  
  48. /**
  49. * https post请求
  50. *
  51. * @param url 请求地址
  52. * @param headerMap 请求头信息
  53. * @param contentMap 请求体信息
  54. * @return 结果返回
  55. */
  56. public static String httpsPost(String url, Map<String, String> headerMap, Map<String, String> contentMap) {
  57. return httpsPost(url, headerMap, contentMap, "UTF-8");
  58. }
  59.  
  60. /**
  61. * http post请求
  62. *
  63. * @param url 请求地址
  64. * @param headerMap 请求头信息
  65. * @param contentMap 请求体信息
  66. * @return 结果返回
  67. */
  68. public static String httpPost(String url, Map<String, String> headerMap, Map<String, String> contentMap) {
  69. return httpPost(url, headerMap, contentMap, "UTF-8");
  70. }
  71.  
  72. /**
  73. * https get请求
  74. *
  75. * @param url 请求地址
  76. * @param paramMap 请求参数
  77. * @return 结果返回
  78. */
  79. public static String httpsGet(String url, Map<String, String> paramMap) {
  80. return httpsGet(url, paramMap, "UTF-8");
  81. }
  82.  
  83. /**
  84. * http get请求
  85. *
  86. * @param url 请求地址
  87. * @param paramMap 请求参数
  88. * @return 结果返回
  89. */
  90. public static String httpGet(String url, Map<String, String> paramMap) {
  91. return httpGet(url, paramMap, "UTF-8");
  92. }
  93.  
  94. /**
  95. * @param url 请求地址
  96. * @param headerMap 请求头信息
  97. * @param contentMap 请求体信息
  98. * @param charset 编码类型
  99. * @return 结果返回
  100. */
  101. public static String httpsPost(String url, Map<String, String> headerMap, Map<String, String> contentMap, String charset) {
  102. return post(url, headerMap, contentMap, charset, CLIENT_TYPE.HTTPS);
  103. }
  104.  
  105. /**
  106. * @param url 请求地址
  107. * @param headerMap 请求头信息
  108. * @param contentMap 请求体信息
  109. * @param charset 编码类型
  110. * @return 结果返回
  111. */
  112. public static String httpPost(String url, Map<String, String> headerMap, Map<String, String> contentMap, String charset) {
  113. return post(url, headerMap, contentMap, charset, CLIENT_TYPE.HTTP);
  114. }
  115.  
  116. /**
  117. * @param url 请求地址
  118. * @param paramMap 请求参数
  119. * @param charset 编码类型
  120. * @return 结果返回
  121. */
  122. public static String httpsGet(String url, Map<String, String> paramMap, String charset) {
  123. return get(url, paramMap, charset, CLIENT_TYPE.HTTPS);
  124. }
  125.  
  126. /**
  127. * @param url 请求地址
  128. * @param paramMap 请求参数
  129. * @param charset 编码类型
  130. * @return 结果返回
  131. */
  132. public static String httpGet(String url, Map<String, String> paramMap, String charset) {
  133. return get(url, paramMap, charset, CLIENT_TYPE.HTTP);
  134. }
  135.  
  136. /**
  137. * post 请求的实际方法
  138. *
  139. * @param url 请求地址
  140. * @param headerMap 请求头信息
  141. * @param contentMap 请求体信息
  142. * @param charset 编码类型
  143. * @param type 协议类型
  144. * @return 结果返回
  145. */
  146. private static String post(String url, Map<String, String> headerMap, Map<String, String> contentMap, String charset, CLIENT_TYPE type) {
  147. if (StringUtils.isBlank(url)) {
  148. throw new RuntimeException("请求url为空");
  149. }
  150.  
  151. String result = null;
  152. HttpClient httpClient = null;
  153. try {
  154. HttpPost post = new HttpPost(url);
  155. if (MapUtils.isNotEmpty(headerMap)) {// 设置请求头
  156. for (Map.Entry<String, String> entry : headerMap.entrySet()) {
  157. post.addHeader(entry.getKey(), entry.getValue());
  158. }
  159. }
  160.  
  161. if (MapUtils.isNotEmpty(contentMap)) {// 设置请求体
  162. List<NameValuePair> content = getNameValuePairList(contentMap);
  163. UrlEncodedFormEntity entity = new UrlEncodedFormEntity(content, charset);
  164. post.setEntity(entity);
  165. }
  166.  
  167. httpClient = getClient(type);//这里是重点,根据不同协议获取不同类型的client端
  168. HttpResponse response = httpClient.execute(post);//发送请求并接收返回数据
  169. if (response != null) {
  170. HttpEntity resEntity = response.getEntity();
  171. if (resEntity != null) {
  172. result = EntityUtils.toString(resEntity, charset);
  173. }
  174. }
  175. return result;
  176. } catch (Exception ex) {
  177. throw new RuntimeException("请求:" + url + " 异常:" + ex.getMessage());
  178. } finally {
  179. try {
  180. if (null != httpClient && null != httpClient.getConnectionManager()) {
  181. httpClient.getConnectionManager().shutdown();
  182. }
  183. } catch (Exception e) {
  184. logger.error("请求:" + url + " 流关闭异常或者httpclient关闭异常");
  185. }
  186. }
  187. }
  188.  
  189. /**
  190. * get 请求的实际方法
  191. *
  192. * @param url 请求地址
  193. * @param paramMap 请求参数
  194. * @param charset 编码类型
  195. * @param type 协议类型
  196. * @return 结果返回
  197. */
  198. private static String get(String url, Map<String, String> paramMap, String charset, CLIENT_TYPE type) {
  199. if (StringUtils.isBlank(url)) {
  200. throw new RuntimeException("请求url为空");
  201. }
  202.  
  203. String result = null;
  204. HttpClient httpClient = null;
  205. try {
  206. if (MapUtils.isNotEmpty(paramMap)) {// 拼接参数
  207. // 设置请求体
  208. List<NameValuePair> content = getNameValuePairList(paramMap);
  209. UrlEncodedFormEntity entity = new UrlEncodedFormEntity(content, charset);
  210. String params = EntityUtils.toString(entity);
  211. url = url + "?" + params;
  212. }
  213.  
  214. HttpGet get = new HttpGet(url);
  215. httpClient = getClient(type);
  216. HttpResponse response = httpClient.execute(get); //发送请求并接收返回数据
  217. if (response != null) {
  218. HttpEntity resEntity = response.getEntity();
  219. if (resEntity != null) {
  220. result = EntityUtils.toString(resEntity, charset);
  221. }
  222. }
  223. return result;
  224. } catch (Exception ex) {
  225. throw new RuntimeException("请求:" + url + " 异常:" + ex.getMessage());
  226. } finally {
  227. try {
  228. if (null != httpClient && null != httpClient.getConnectionManager()) {
  229. httpClient.getConnectionManager().shutdown();
  230. }
  231. } catch (Exception e) {
  232. logger.error("请求:" + url + " 流关闭异常或者httpclient关闭异常");
  233. }
  234. }
  235. }
  236.  
  237. private static List<NameValuePair> getNameValuePairList(Map<String, String> paramMap) {
  238. List<NameValuePair> content = null;
  239. if (MapUtils.isNotEmpty(paramMap)) {
  240. // 设置请求体
  241. content = new ArrayList<NameValuePair>();
  242. for (Map.Entry<String, String> entry : paramMap.entrySet()) {
  243. content.add(new BasicNameValuePair(entry.getKey(), entry.getValue()));
  244. }
  245. }
  246. return content;
  247. }
  248.  
  249. /**
  250. * 根据指定类型返回http、https类型的客户端
  251. *
  252. * @param type 类型
  253. * @return 客户端
  254. * @throws Exception 异常信息
  255. */
  256. private static DefaultHttpClient getClient(CLIENT_TYPE type) throws Exception {
  257. if (type == CLIENT_TYPE.HTTP) {//http类型
  258. return new DefaultHttpClient();
  259. } else if (type == CLIENT_TYPE.HTTPS) {//https类型
  260. return new SSLClient();
  261. } else {
  262. throw new RuntimeException("未知协议类型,请重新指定");
  263. }
  264. }
  265.  
  266. /**
  267. * 自定义SSL client
  268. */
  269. static class SSLClient extends DefaultHttpClient {
  270. public SSLClient() throws Exception {
  271. super();
  272. X509TrustManager tm = new X509TrustManager() {
  273. @Override
  274. public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
  275. }
  276.  
  277. @Override
  278. public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
  279. }
  280.  
  281. @Override
  282. public X509Certificate[] getAcceptedIssuers() {
  283. return null;
  284. }
  285. };
  286. //传输协议需要根据自己的判断 
  287. //SSLContext ctx = SSLContext.getInstance("TLSv1.2");
  288. SSLContext ctx = SSLContext.getInstance("TLS");
  289. ctx.init(null, new TrustManager[]{tm}, null);
  290. SSLSocketFactory ssf = new SSLSocketFactory(ctx, SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
  291. ClientConnectionManager ccm = this.getConnectionManager();
  292. SchemeRegistry sr = ccm.getSchemeRegistry();
  293. sr.register(new Scheme("https", 443, ssf));
  294. }
  295. }
  296.  
  297. public static void main(String[] args) {
  298. //Map<String, String> param = new HashMap<String, String>();
  299. //param.put("fr", "aladdin");
  300. //String result = httpsGet("https://baike.baidu.com/item/%E5%89%81%E6%A4%92%E9%B1%BC%E5%A4%B4/1171373", param);
  301.  
  302. //String result = httpsGet("https://baike.baidu.com/item/%E5%89%81%E6%A4%92%E9%B1%BC%E5%A4%B4/1171373?fr=aladdin", null);
  303. //String result = httpGet("http://www.baidu.com",null);
  304.  
  305. //System.out.println(result);
  306. }
  307.  
  308. }

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. vi编辑器设置行号可见

    vi 设置行号 需要切换到命令模式下,输入set number :set number 按下回车即可

  2. codeforces 437A. The Child and Homework 解题报告

    题目链接:http://codeforces.com/problemset/problem/437/A 题目意思:给出四个选项A.B.C.D选项的内容描述,要求选出符合以下条件的一项. (1)如果某个 ...

  3. HNOI2017 day1 T3 礼物

    题目大意: 我的室友最近喜欢上了一个可爱的小女生.马上就要到她的生日了,他决定买一对情侣手环,一个留给自己,一个送给她.每个手环上各有 n 个装饰物,并且每个装饰物都有一定的亮度.但是在她生日的前一天 ...

  4. bzoj1003物流运输——DP

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1003 DP好题: 直接找一个时间段的最短路,并用它来预处理出每个时间段的最小花费: f[i] ...

  5. const 和指针

    c++用了那么久,觉得 const 和指针配合到一起的时候就会有点点分不出来. 如下: const Data* pData; Data const * pData Data * const pData ...

  6. JAVA线程同步 (一)wait(), notify()和notifyAll()使用

    wait(),notify()和notifyAll()都是java.lang.Object的方法: wait(): Causes the current thread to wait until an ...

  7. Bootstrap-CSS:辅助类

    ylbtech-Bootstrap-CSS:辅助类 1.返回顶部 1. Bootstrap 辅助类 本章将讨论 Bootstrap 中的一些可能会派上用场的辅助类. 文本 以下不同的类展示了不同的文本 ...

  8. STL排序和检索

    //参考书是刘汝佳的那本算法书P108 //sort的用法也就是本来是从小到大排序,如果想要从大到小,中间写一个比较函数就可以了: //以下两个检索的东西 //lower_bound找到一个值的最小插 ...

  9. python 面向对象十二 元类

    一.类也是对象 只要使用关键字class,Python解释器在执行的时候就会创建一个对象.下面的代码段: class ObjectCreator(object): pass 将在内存中创建一个对象,名 ...

  10. (DP)51NOD 1006 最长公共子序列&1092 回文字符串

    1006 给出两个字符串A B,求A与B的最长公共子序列(子序列不要求是连续的). 比如两个串为:   abcicba abdkscab   ab是两个串的子序列,abc也是,abca也是,其中abc ...