客戶端向服務器發送數據時,份兩種情況,SSL單向驗證和SSL雙向驗證
1.SSL單向驗證時
代碼如下:
- import java.io.IOException;
- import java.util.HashMap;
- import java.util.Map;
- import org.apache.commons.httpclient.HttpClient;
- import org.apache.commons.httpclient.HttpException;
- import org.apache.commons.httpclient.HttpStatus;
- import org.apache.commons.httpclient.NameValuePair;
- import org.apache.commons.httpclient.methods.PostMethod;
- import org.apache.commons.httpclient.params.HttpClientParams;
- import org.apache.commons.httpclient.params.HttpMethodParams;
- import org.apache.commons.logging.Log;
- import org.apache.commons.logging.LogFactory;
- public class ClientSendData {
- static Log log = LogFactory.getLog(ClientSendData.class);
- private String Url;
- // 初始化數據
- public ClientSendData() {
- Url = "https://test.yihaodian.com:8443/ims/feedbackToPingAn_getData.action";
- }
- public String sendData(String data) {
- String receivedData = null;
- try {
- Map<String, String> paramsData = new HashMap<String, String>();
- paramsData.put("data", data);
- receivedData = send(Url, paramsData);
- } catch (Exception e) {
- e.printStackTrace();
- }
- return receivedData;
- }
- public static String send(String url, Map<String, String> paramsMap) {
- String result = null;
- PostMethod postMethod = null;
- HttpClient httpClient = new HttpClient();
- httpClient.getParams().setParameter(
- HttpMethodParams.HTTP_CONTENT_CHARSET, "utf-8");
- postMethod = new PostMethod(url);
- if (paramsMap != null && paramsMap.size() > 0) {
- NameValuePair[] datas = new NameValuePair[paramsMap.size()];
- int index = 0;
- for (String key : paramsMap.keySet()) {
- datas[index++] = new NameValuePair(key, paramsMap.get(key));
- }
- postMethod.setRequestBody(datas);
- }
- HttpClientParams httparams = new HttpClientParams();
- httparams.setSoTimeout(60000);
- postMethod.setParams(httparams);
- try {
- int statusCode = httpClient.executeMethod(postMethod);
- if (statusCode == HttpStatus.SC_OK) {
- result = postMethod.getResponseBodyAsString();
- log.info("發送成功!");
- } else {
- log.error(" http response status is " + statusCode);
- }
- } catch (HttpException e) {
- log.error("error url=" + url, e);
- } catch (IOException e) {
- log.error("error url=" + url, e);
- } finally {
- if (postMethod != null) {
- postMethod.releaseConnection();
- }
- }
- return result;
- }
- public static void main(String[] args) {
- ClientSendData t = new ClientSendData();
- t.sendData("測試SSL單項連接,向服務端發送數據!");
- }
- }
可能出現的異常
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如何在雙向驗證時發送數據的,懇請指教。
文章列表