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.国产数据 ...
随机推荐
- vi编辑器设置行号可见
vi 设置行号 需要切换到命令模式下,输入set number :set number 按下回车即可
- codeforces 437A. The Child and Homework 解题报告
题目链接:http://codeforces.com/problemset/problem/437/A 题目意思:给出四个选项A.B.C.D选项的内容描述,要求选出符合以下条件的一项. (1)如果某个 ...
- HNOI2017 day1 T3 礼物
题目大意: 我的室友最近喜欢上了一个可爱的小女生.马上就要到她的生日了,他决定买一对情侣手环,一个留给自己,一个送给她.每个手环上各有 n 个装饰物,并且每个装饰物都有一定的亮度.但是在她生日的前一天 ...
- bzoj1003物流运输——DP
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1003 DP好题: 直接找一个时间段的最短路,并用它来预处理出每个时间段的最小花费: f[i] ...
- const 和指针
c++用了那么久,觉得 const 和指针配合到一起的时候就会有点点分不出来. 如下: const Data* pData; Data const * pData Data * const pData ...
- JAVA线程同步 (一)wait(), notify()和notifyAll()使用
wait(),notify()和notifyAll()都是java.lang.Object的方法: wait(): Causes the current thread to wait until an ...
- Bootstrap-CSS:辅助类
ylbtech-Bootstrap-CSS:辅助类 1.返回顶部 1. Bootstrap 辅助类 本章将讨论 Bootstrap 中的一些可能会派上用场的辅助类. 文本 以下不同的类展示了不同的文本 ...
- STL排序和检索
//参考书是刘汝佳的那本算法书P108 //sort的用法也就是本来是从小到大排序,如果想要从大到小,中间写一个比较函数就可以了: //以下两个检索的东西 //lower_bound找到一个值的最小插 ...
- python 面向对象十二 元类
一.类也是对象 只要使用关键字class,Python解释器在执行的时候就会创建一个对象.下面的代码段: class ObjectCreator(object): pass 将在内存中创建一个对象,名 ...
- (DP)51NOD 1006 最长公共子序列&1092 回文字符串
1006 给出两个字符串A B,求A与B的最长公共子序列(子序列不要求是连续的). 比如两个串为: abcicba abdkscab ab是两个串的子序列,abc也是,abca也是,其中abc ...