發送類:
import java.io.IOException;
import java.io.OutputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.security.GeneralSecurityException;
import java.security.cert.X509Certificate;
import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSession;
import javax.net.ssl.X509TrustManager;
import com.cltc.adapter.ce.CommunicationToken;
/**
* <p>Description:通過Https發送訊息</p>
*/
public class DataSender
{
private final static String HTTPS_TRANSMIT_LOCATION = "HTTPS Transmitter";
//重寫X509TrustManager類的三個方法,信任伺服器憑證
private X509TrustManager xtm = new X509TrustManager() {
public void checkClientTrusted(X509Certificate[] chain, String authType) {}
public void checkServerTrusted(X509Certificate[] chain, String authType) {}
public X509Certificate[] getAcceptedIssuers() { return null; }
};
//信任主機
private HostnameVerifier hnv = new HostnameVerifier() {
public boolean verify(String hostname, SSLSession session) { return true; }
};
//構造初始化SSLContext
public DataSender() {
SSLContext sslContext = null;
try {
sslContext = SSLContext.getInstance("TLS");
X509TrustManager[] xtmArray = new X509TrustManager[] { xtm };
sslContext.init(null, xtmArray, new java.security.SecureRandom());
} catch(GeneralSecurityException gse) {
System.out.println("Https:DataSender:General Security Exception .");
gse.getStackTrace();
}
if(sslContext != null) {
HttpsURLConnection.setDefaultSSLSocketFactory(sslContext.getSocketFactory());
}
HttpsURLConnection.setDefaultHostnameVerifier(hnv);
}
/**
* 通過HTTPS發送訊息
*/
public int sendMessage( CommunicationToken ct ) throws MalformedURLException, IOException
{
//System.setProperty("javax.net.debug","true");
URL remoteHostURL;
HttpsURLConnection httpsUrlConnection = null;
//建立串連
try
{
remoteHostURL = new URL( ct.getRemoteHostURI() );
System.out.println( ct.getRemoteHostURI());
httpsUrlConnection = (HttpsURLConnection)remoteHostURL.openConnection();
}
catch( Exception _ex )
{
System.out.println( "Unable to openConnection on URL." );
_ex.printStackTrace();
}
byte[] Msg = ct.getMessage();
HttpsURLConnection.setFollowRedirects( true );
httpsUrlConnection.setInstanceFollowRedirects( true );
httpsUrlConnection.setDoOutput( true );
httpsUrlConnection.setDoInput( true );
httpsUrlConnection.setRequestMethod( "POST" );
httpsUrlConnection.setRequestProperty( "Content-length", Integer.toString( Msg.length ) );
httpsUrlConnection.setRequestProperty( "Content-type", "application/x-xxxxxxxx; version=1.0" );
httpsUrlConnection.connect();
OutputStream outStream = null;
try
{
outStream = httpsUrlConnection.getOutputStream();
outStream.write( Msg );
outStream.flush();
}
finally
{
if( outStream != null )
{
outStream.close();
}
}
int responseCode = httpsUrlConnection.getResponseCode();
System.out.println( "Https_DataSender:" + responseCode );
return responseCode;
}
}
-----------------------------------------------------------------------------------------------------------------------
Servlet接收:
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.cltc.adapter.ce.CommunicationToken;
import com.cltc.adapter.ce.http.DataReceiver;
/**
* HTTP-SSL Receiver servlet.
*/
public class HttpSSLPostReceiver_v11 extends HttpServlet {
public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
PrintWriter out = res.getWriter();
out.println("<HTML>");
out.println("<BODY>");
out.println("<BR>You have performed an HTTPS GET on this URL. <BR>");
out.println("To submit a message, you must POST the message to this URL <BR>");
out.println("</BODY>");
out.println("</HTML>");
}
public void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException{
System.out.println("Receive file via Https.");
int responseFromPSC;
byte Message[] = new byte[req.getContentLength()];
InputStream ThisStream = req.getInputStream();
for(int BytesRead = 0,Offset = 0;BytesRead != -1;Offset += BytesRead)
{
BytesRead = ThisStream.read(Message,Offset,1000);
}
responseFromPSC=callHttpReceiver(res, Message);
}
public int callHttpReceiver(HttpServletResponse res, byte[] Message) {
CommunicationToken ct = new CommunicationToken();
int responseFromPSC;
ct.setRNMessage(Message);
ct.setVersion(1);
responseFromPSC = 500;
DataReceiver.getInstance().receiveMessage( ct );
return responseFromPSC;
}
}