-
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);
-
//設(shè)置為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./xml/ns/javaee"
-
xmlns:xsi="http://www./2001/XMLSchema-instance"
-
xsi:schemaLocation="http://java./xml/ns/javaee
-
http://java./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);
-
}
-
}
|