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.国产数据 ...
随机推荐
- linux初级学习笔记八:linux权限管理及权限管理命令详解!(视频序号:04_2)
本节学习的命令:chown,chgrp,chmod,openssl,umask 本节学习的技能: 文件权限详解及对其的操作 生成随机密码命令 用遮罩码对用户权限进行修改 站在用户登陆的角度来说SHEL ...
- 非旋treap (BZOJ1895)
记个板子,还是挺好用的. #include <bits/stdc++.h> using namespace std; ]; int rt,n,m,l,r,x,A,B,C,t; struct ...
- label标签的可访问性
与表单元素关联的方法(IE6下label标签包裹控件的方法是不顶用的): 1 使用for和id关联控件 <p><label for="test">标签< ...
- UltraISO制作U盘启动盘-centos7
1.下载.安装UltraISO软件,(网上找到下载) 2.安装好以后,打开软件,显示如下界面: 3.选择镜像 点击菜单栏的“文件”选项,再点击“打开”按钮,选择要刻录的系统镜像: 4.点击菜单栏的“启 ...
- UVa 1642 Magical GCD (暴力+数论)
题意:给出一个长度在 100 000 以内的正整数序列,大小不超过 10^ 12.求一个连续子序列,使得在所有的连续子序列中, 它们的GCD值乘以它们的长度最大. 析:暴力枚举右端点,然后在枚举左端点 ...
- 枚举与#define 宏的区别
1),#define 宏常量是在预编译阶段进行简单替换.枚举常量则是在编译的时候确定其值.2),一般在编译器里,可以调试枚举常量,但是不能调试宏常量.3),枚举可以一次定义大量相关的常量,而#defi ...
- codeforces 611C
题意: 给你一个矩阵,矩阵里有" . "和" # "," . "表示空的," # "表示禁止的. 多米诺骨牌将占据正好有 ...
- HK算法模板+小优化(跑的快一点点)
HUST 2604 #include <iostream> #include <cstdlib> #include <cstdio> #include <cs ...
- curl:出现SSL错误提示
在上一篇博文中,升级ruby版本中,提示如下错误: 1) Error fetching https://mirrors.aliyun.com/rubygems/: [root@web ~]# gem ...
- common.py OpenCv例程阅读
#!/usr/bin/env python ''' This module contais some common routines used by other samples. ''' import ...