有關tomcat 6.0如何配置https服務的文章可以參考:http://blog.csdn.net/zhou_zion/article/details/6759171
以下主要講解如何使用https發起post請求:
參考文檔:梁棟前輩的《Java加密與解密的藝術》
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()); // 關閉密鑰庫檔案流 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); } /** * 發送請求. * @param httpsUrl * 請求的地址 * @param xmlStr * 請求的資料 */ 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可以解決伺服器接收時讀取的資料中文亂碼問題 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); // 發起請求 HttpsPost.post(httpsUrl, xmlStr); }}
import javax.net.ssl.HostnameVerifier;import javax.net.ssl.SSLSession;/** * 實現用於主機名稱驗證的基底介面。 * 在握手期間,如果 URL 的主機名稱和伺服器的標識主機名稱不匹配,則驗證機制可以回調此介面的實現程式來確定是否應該允許此串連。 */public class MyHostnameVerifier implements HostnameVerifier {@Overridepublic 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);}}