有關(guān)tomcat 6.0如何配置https服務的文章可以參考:http://blog.csdn.net/zhou_zion/article/details/6759171
以下主要講解如何使用https發(fā)起post請求:
參考文檔:梁棟前輩的《Java加密與解密的藝術(shù)》
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;
import java.security.GeneralSecurityException;
import java.security.KeyStore;
import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.KeyManagerFactory;
import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManagerFactory;
public class HttpsPost {
/**
* 獲得KeyStore.
* @param keyStorePath
* 密鑰庫路徑
* @param password
* 密碼
* @return 密鑰庫
* @throws Exception
*/
public static KeyStore getKeyStore(String password, String keyStorePath)
throws Exception {
// 實例化密鑰庫
KeyStore ks = KeyStore.getInstance("JKS");
// 獲得密鑰庫文件流
FileInputStream is = new FileInputStream(keyStorePath);
// 加載密鑰庫
ks.load(is, password.toCharArray());
// 關(guān)閉密鑰庫文件流
is.close();
return ks;
}
/**
* 獲得SSLSocketFactory.
* @param password
* 密碼
* @param keyStorePath
* 密鑰庫路徑
* @param trustStorePath
* 信任庫路徑
* @return SSLSocketFactory
* @throws Exception
*/
public static SSLContext getSSLContext(String password,
String keyStorePath, String trustStorePath) throws Exception {
// 實例化密鑰庫
KeyManagerFactory keyManagerFactory = KeyManagerFactory
.getInstance(KeyManagerFactory.getDefaultAlgorithm());
// 獲得密鑰庫
KeyStore keyStore = getKeyStore(password, keyStorePath);
// 初始化密鑰工廠
keyManagerFactory.init(keyStore, password.toCharArray());
// 實例化信任庫
TrustManagerFactory trustManagerFactory = TrustManagerFactory
.getInstance(TrustManagerFactory.getDefaultAlgorithm());
// 獲得信任庫
KeyStore trustStore = getKeyStore(password, trustStorePath);
// 初始化信任庫
trustManagerFactory.init(trustStore);
// 實例化SSL上下文
SSLContext ctx = SSLContext.getInstance("TLS");
// 初始化SSL上下文
ctx.init(keyManagerFactory.getKeyManagers(),
trustManagerFactory.getTrustManagers(), null);
// 獲得SSLSocketFactory
return ctx;
}
/**
* 初始化HttpsURLConnection.
* @param password
* 密碼
* @param keyStorePath
* 密鑰庫路徑
* @param trustStorePath
* 信任庫路徑
* @throws Exception
*/
public static void initHttpsURLConnection(String password,
String keyStorePath, String trustStorePath) throws Exception {
// 聲明SSL上下文
SSLContext sslContext = null;
// 實例化主機名驗證接口
HostnameVerifier hnv = new MyHostnameVerifier();
try {
sslContext = getSSLContext(password, keyStorePath, trustStorePath);
} catch (GeneralSecurityException e) {
e.printStackTrace();
}
if (sslContext != null) {
HttpsURLConnection.setDefaultSSLSocketFactory(sslContext
.getSocketFactory());
}
HttpsURLConnection.setDefaultHostnameVerifier(hnv);
}
/**
* 發(fā)送請求.
* @param httpsUrl
* 請求的地址
* @param xmlStr
* 請求的數(shù)據(jù)
*/
public static void post(String httpsUrl, String xmlStr) {
HttpsURLConnection urlCon = null;
try {
urlCon = (HttpsURLConnection) (new URL(httpsUrl)).openConnection();
urlCon.setDoInput(true);
urlCon.setDoOutput(true);
urlCon.setRequestMethod("POST");
urlCon.setRequestProperty("Content-Length",
String.valueOf(xmlStr.getBytes().length));
urlCon.setUseCaches(false);
//設置為gbk可以解決服務器接收時讀取的數(shù)據(jù)中文亂碼問題
urlCon.getOutputStream().write(xmlStr.getBytes("gbk"));
urlCon.getOutputStream().flush();
urlCon.getOutputStream().close();
BufferedReader in = new BufferedReader(new InputStreamReader(
urlCon.getInputStream()));
String line;
while ((line = in.readLine()) != null) {
System.out.println(line);
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 測試方法.
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
// 密碼
String password = "123456";
// 密鑰庫
String keyStorePath = "tomcat.keystore";
// 信任庫
String trustStorePath = "tomcat.keystore";
// 本地起的https服務
String httpsUrl = "https://localhost:8443/service/httpsPost";
// 傳輸文本
String xmlStr = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><fruitShop><fruits><fruit><kind>蘿卜</kind></fruit><fruit><kind>菠蘿</kind></fruit></fruits></fruitShop>";
HttpsPost.initHttpsURLConnection(password, keyStorePath, trustStorePath);
// 發(fā)起請求
HttpsPost.post(httpsUrl, xmlStr);
}
}
import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.SSLSession;
/**
* 實現(xiàn)用于主機名驗證的基接口朝抖。
* 在握手期間升熊,如果 URL 的主機名和服務器的標識主機名不匹配简烘,則驗證機制可以回調(diào)此接口的實現(xiàn)程序來確定是否應該允許此連接切揭。
*/
public class MyHostnameVerifier implements HostnameVerifier {
@Override
public boolean verify(String hostname, SSLSession session) {
if("localhost".equals(hostname)){
return true;
} else {
return false;
}
}
}
接收請求的Web應用:
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<servlet>
<servlet-name>rollBack</servlet-name>
<servlet-class>rollBack</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>rollBack</servlet-name>
<url-pattern>/httpsPost</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
rollBack servlet
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import javax.servlet.ServletException;
import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class rollBack extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//獲取請求流
ServletInputStream sis = request.getInputStream();
BufferedReader in = new BufferedReader(new InputStreamReader(sis));
String line;
if((line = in.readLine()) != null){
System.out.println(line);
}
in.close();
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
this.doGet(request, response);
}
}
使用apache的httpClient是一個最常用的開源的java第三方工具包
需要httpclent.jar
創(chuàng)建client的工具類
public static CloseableHttpClient createSSLClientDefault(){
try {
SSLContext sslContext = new SSLContextBuilder().loadTrustMaterial(null, new TrustStrategy() {
//信任所有
public boolean isTrusted(X509Certificate[] chain,
String authType) throws CertificateException {
return true;
}
}).build();
SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslContext);
return HttpClients.custom().setSSLSocketFactory(sslsf).build();
} catch (KeyManagementException e) {
e.printStackTrace();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (KeyStoreException e) {
e.printStackTrace();
}
return HttpClients.createDefault();
}
通過這個client訪問https的url地址
關(guān)鍵代碼:
//上面的工具類
CloseableHttpClient httpClient = HttpClientUtil.createSSLClientDefault();
HttpGet get = new HttpGet();
get.setURI(new URI("你的https://地址"));
httpClient.execute(get)
//...........后續(xù)操作