欢迎访问昆山宝鼎软件有限公司网站! 设为首页 | 网站地图 | XML | RSS订阅 | 宝鼎邮箱 | 后台管理


新闻资讯

MENU

软件开发知识

KeyManagementException { String result = null; SSLContext s

点击: 次  来源:宝鼎软件 时间:2017-09-29

原文出处: Hosee

配景:

记录一下利用中关于HttpClient以及Json通报的坑。

HTTPS:

普通方法:

public class Test {
    public static void main(String[] args) throws Exception {

        URI uri = new URIBuilder().setScheme("http").setHost("***:**")
            .setPath("/***/***").build();

        HttpClient httpClient = HttpClientBuilder.create().build();

        HttpPost httpPost = new HttpPost(uri);
        httpPost.addHeader("Content-Type", "application/x-www-form-urlencoded");

        List<NameValuePair> params = new ArrayList<NameValuePair>();
        params.add(new BasicNameValuePair("params", "test"));

        HttpResponse httpResponse = httpClient.execute(httpPost);

        StatusLine httpStatus = httpResponse.getStatusLine();
        HttpEntity httpEntity = httpResponse.getEntity();

        System.out.println("httpStatusline: " + httpStatus);
        System.out.println("strEntity: " + EntityUtils.toString(httpEntity));
        EntityUtils.consume(httpEntity);
    }
}

这种适合普通的http的请求,软件开发,当把Scheme换成https时,软件开发,

报错:

sun.security.validator.ValidatorException: PKIX path building failed

客户端没有证书,可以在代码中跳过证书验证。

public static String sendPost(final URI uri,
                                  final List<NameValuePair> params) throws ClientProtocolException,
                                                                    IOException,
                                                                    NoSuchAlgorithmException,
                                                                    KeyManagementException {
        String result = null;
        SSLContext sslContext = SSLContext.getInstance("SSL");

        // set up a TrustManager that trusts everything
        sslContext.init(null, new TrustManager[] { new X509TrustManager() {
            public X509Certificate[] getAcceptedIssuers() {
                return null;
            }

            public void checkClientTrusted(X509Certificate[] certs, String authType) {
            }

            public void checkServerTrusted(X509Certificate[] certs, String authType) {
            }
        } }, new SecureRandom());

        CloseableHttpClient httpclient = HttpClients.custom()
            .setSSLSocketFactory(new SSLSocketFactory(sslContext)).build();

        HttpPost httpPost = new HttpPost(uri);

        httpPost.addHeader("Content-type", "application/json");

        httpPost.setEntity(new UrlEncodedFormEntity(params));

        CloseableHttpResponse response = httpclient.execute(httpPost);

        try {
            HttpEntity entity = response.getEntity();
            result = EntityUtils.toString(entity);
            EntityUtils.consume(entity);
        } finally {
            response.close();
        }
        return result;
    }

request.getParameter无法获得appliation/json的数据

    @ResponseBody
    @RequestMapping(value = "/**/**.json", method = RequestMethod.POST)
    public String valiate(ModelMap map, HttpServletRequest request) {
          System.out.println(request.getParameter("param"));
    }

这种方法无法获得Content-Type是appliation/json的数据。

这种方法适合Content-Type为application/x-www-form-urlencoded的请求。

办理:

    @ResponseBody
    @RequestMapping(value = "/**/**.json", method = RequestMethod.POST )
    public String valiate(ModelMap map, @RequestBody String request) {
          JSONObject requestJson = JSON.parseObject(request);
    }

这里需要说明的是@RequestBody需要接的参数是一个string化的json,而不是一个json工具,也可以用工具范例来吸收。

Reference:

1. http://blog.csdn.net/mack415858775/article/details/52388484

2. http://blog.csdn.net/g1248019684/article/details/50850386

劳务派遣管理系统