做项目要用到httpClient发送https到服务器,要求URL中带参数,并且发送xml格式的报文,第一次做,在这里记录一下,以便以后查询的帮助别人:本文在证书配置正确的前提下执行


客户端代码;

    public static void httpsRequest() throws Exception {
    	System.out.println("this is https");
        KeyStore trustStore  = KeyStore.getInstance("PKCS12");
        FileInputStream instream = new FileInputStream(STORE);
        System.out.println(instream);
        try {
            trustStore.load(instream, PASSWD.toCharArray());
        } finally {
            instream.close();
        }

        // Trust own CA and all self-signed certs
        SSLContext sslcontext = SSLContexts.custom().loadTrustMaterial(trustStore, new TrustSelfSignedStrategy()).build();
        // Allow TLSv1 protocol only
        SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(
                sslcontext,
                new String[] { "TLSv1" },
                null,
                SSLConnectionSocketFactory.BROWSER_COMPATIBLE_HOSTNAME_VERIFIER);
        CloseableHttpClient httpclient = HttpClients.custom().setSSLSocketFactory(sslsf).build();
        try {
        	String timestamp = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());
            List<NameValuePair> nvps = new ArrayList<NameValuePair>();  
            nvps.add(new BasicNameValuePair("sign", sign("timestamp"+timestamp+"v"+V)));  
            nvps.add(new BasicNameValuePair("timestamp", "timestamp"));  
            nvps.add(new BasicNameValuePair("v", "1.0"));  
            HttpPost httpPost = new HttpPost(URL+"?"+ URLEncodedUtils.format(nvps, "UTF-8"));
            StringEntity sendbody = new StringEntity(xmlData+getParams(),"UTF-8");
            httpPost.setEntity(sendbody); 
            httpPost.setHeader("Content-Type", "text/xml;charset=UTF-8");

            System.out.println("executing request   " + httpPost.getRequestLine());
            CloseableHttpResponse response = httpclient.execute(httpPost);
            try {
                HttpEntity entity = response.getEntity();

                System.out.println("----------------------------------------");
                System.out.println(response.getStatusLine());
                if (entity != null) {
                    System.out.println("Response content length: " + entity.getContentLength());
                }
                EntityUtils.consume(entity);
            } finally {
                response.close();
            }
        } finally {
            httpclient.close();
        }    	
    }

客户端,运行结果

httpClient发送https 请求_https


服务器代码,证书配置在tomcat的server.xml中;

	public String infoQuery(){
		System.out.println("+++++++++++++++++++++++++++++++");
		try {
			HttpServletRequest request = ServletActionContext.getRequest();
			String version = request.getParameter("v");
			String timestamp = request.getParameter("timestamp");
			String sign = request.getParameter("sign");
			System.out.println(version);
			System.out.println(timestamp);
			System.out.println(sign);
			byte[] buffer = new byte[1024];
			int length = request.getInputStream().read(buffer);
			String encode = request.getCharacterEncoding();
			System.out.println(length + " <<<>>> " + encode );
			byte[] data = new byte[length];
			System.arraycopy(buffer, 0, data, 0, length);
			String content = new String(data, encode);
			System.out.println(content);
		} catch (IOException e) {
			logger.error("",e);
		}
		System.out.println("ssssssddddddsssssssss");
		return SUCCESS;
	}

服务器运行结果

httpClient发送https 请求_https_02