文章出處

客戶端向服務器發送數據時,份兩種情況,SSL單向驗證和SSL雙向驗證

 

1.SSL單向驗證時

 

代碼如下:

Java代碼  收藏代碼
  1. import java.io.IOException;  
  2. import java.util.HashMap;  
  3. import java.util.Map;  
  4.   
  5. import org.apache.commons.httpclient.HttpClient;  
  6. import org.apache.commons.httpclient.HttpException;  
  7. import org.apache.commons.httpclient.HttpStatus;  
  8. import org.apache.commons.httpclient.NameValuePair;  
  9. import org.apache.commons.httpclient.methods.PostMethod;  
  10. import org.apache.commons.httpclient.params.HttpClientParams;  
  11. import org.apache.commons.httpclient.params.HttpMethodParams;  
  12. import org.apache.commons.logging.Log;  
  13. import org.apache.commons.logging.LogFactory;  
  14.   
  15. public class ClientSendData {  
  16.     static Log log = LogFactory.getLog(ClientSendData.class);  
  17.   
  18.     private String Url;  
  19.   
  20.     // 初始化數據  
  21.     public ClientSendData() {  
  22.         Url = "https://test.yihaodian.com:8443/ims/feedbackToPingAn_getData.action";  
  23.     }  
  24.   
  25.     public String sendData(String data) {  
  26.         String receivedData = null;  
  27.         try {  
  28.   
  29.             Map<String, String> paramsData = new HashMap<String, String>();  
  30.             paramsData.put("data", data);  
  31.             receivedData = send(Url, paramsData);  
  32.         } catch (Exception e) {  
  33.             e.printStackTrace();  
  34.         }  
  35.         return receivedData;  
  36.     }  
  37.   
  38.     public static String send(String url, Map<String, String> paramsMap) {  
  39.         String result = null;  
  40.         PostMethod postMethod = null;  
  41.         HttpClient httpClient = new HttpClient();  
  42.   
  43.         httpClient.getParams().setParameter(  
  44.                 HttpMethodParams.HTTP_CONTENT_CHARSET, "utf-8");  
  45.         postMethod = new PostMethod(url);  
  46.   
  47.         if (paramsMap != null && paramsMap.size() > 0) {  
  48.             NameValuePair[] datas = new NameValuePair[paramsMap.size()];  
  49.             int index = 0;  
  50.             for (String key : paramsMap.keySet()) {  
  51.                 datas[index++] = new NameValuePair(key, paramsMap.get(key));  
  52.             }  
  53.             postMethod.setRequestBody(datas);  
  54.   
  55.         }  
  56.   
  57.         HttpClientParams httparams = new HttpClientParams();  
  58.         httparams.setSoTimeout(60000);  
  59.         postMethod.setParams(httparams);  
  60.   
  61.         try {  
  62.             int statusCode = httpClient.executeMethod(postMethod);  
  63.             if (statusCode == HttpStatus.SC_OK) {  
  64.                 result = postMethod.getResponseBodyAsString();  
  65.                 log.info("發送成功!");  
  66.             } else {  
  67.                 log.error(" http response status is " + statusCode);  
  68.             }  
  69.   
  70.         } catch (HttpException e) {  
  71.             log.error("error url=" + url, e);  
  72.         } catch (IOException e) {  
  73.             log.error("error url=" + url, e);  
  74.         } finally {  
  75.             if (postMethod != null) {  
  76.                 postMethod.releaseConnection();  
  77.             }  
  78.         }  
  79.   
  80.         return result;  
  81.     }  
  82.   
  83.     public static void main(String[] args) {  
  84.         ClientSendData t = new ClientSendData();  
  85.         t.sendData("測試SSL單項連接,向服務端發送數據!");  
  86.     }  
  87. }  
 

可能出現的異常

1.java.net.ConnectException: Connection refused: connect

 

服務器沒有啟動

 

2 .javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed

 

服務端的證書是不可信的。解決辦法見這篇文章 http://zhuyuehua.iteye.com/blog/1102347

 

3.java.net.SocketException: Software caused connection abort: recv failed

 

這是由于服務端配置的是SSL雙向認證,而客戶端發送數據是按照服務器是單向認證時發送的,即沒有將客戶端證書信息一起發送給服務端。

 

4.org.apache.commons.httpclient.NoHttpResponseException

 

這一般是服務端防火墻的原因。攔截了客戶端請求。

 

另外,當服務端負載過重時,也會出現此問題。

 

5.javax.net.ssl.SSLHandshakeException: Remote host closed connection during handshake

 

這是由于服務端配置的是SSL雙向認證,而客戶端發送數據是按照服務器是單向認證時發送的,即沒有將客戶端證書信息一起發送給服務端。服務端驗證客戶端證書時,發現客戶端沒有證書,然后就斷開了握手連接。

 

2.SSL雙向驗證時

 

雙向驗證時,暫時不知道如何用HTTPCLIENT發送數據,如需要雙向驗證時發送數據,參考我另外的文章。另外,有知道HTTPCLIENT如何在雙向驗證時發送數據的,懇請指教。


文章列表


不含病毒。www.avast.com
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()