您的位置:首页 > 理论基础 > 计算机网络

JAVA实现HTTPS协议POST请求JSON报文

2017-12-11 16:48 821 查看
HTTPS和HTTP的区别

超文本传输协议HTTP协议被用于在Web浏览器和网站服务器之间传递信息。HTTP协议以明文方式发送内容,不提供任何方式的数据加密,如果攻击者截取了Web浏览器和网站服务器之间的传输报文,就可以直接读懂其中的信息,因此HTTP协议不适合传输一些敏感信息,比如信用卡号、密码等。

为了解决HTTP协议的这一缺陷,需要使用另一种协议:安全套接字层超文本传输协议HTTPS。为了数据传输的安全,HTTPS在HTTP的基础上加入了SSL协议,SSL依靠证书来验证服务器的身份,并为浏览器和服务器之间的通信加密。

HTTPS和HTTP的区别主要为以下四点:

一、https协议需要到ca申请证书,一般免费证书很少,需要交费。

二、http是超文本传输协议,信息是明文传输,https 则是具有安全性ssl加密传输协议。

三、http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。

四、http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。

package https;

import java.io.ByteArrayOutputStream;  

import java.io.DataOutputStream;  

import java.io.IOException;  

import java.io.InputStream;  

import java.net.URL;  

import java.security.KeyManagementException;  

import java.security.NoSuchAlgorithmException;  

import java.security.cert.CertificateException;  

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.TrustManager;  

import javax.net.ssl.X509TrustManager;  

import net.sf.json.JSONArray;

import net.sf.json.JSONObject;

  

public class PostJson {  

  

    private static class TrustAnyTrustManager implements X509TrustManager {  

    //该方法检查客户端的证书,若不信任该证书则抛出异常。由于我们不需要对客户端进行认证,因此我们只需要执行默认的信任管理器的这个方法。

    //JSSE中,默认的信任管理器类为TrustManager。

        public void checkClientTrusted(X509Certificate[] chain, String authType)  

                throws CertificateException {  

        }  

        //该方法检查服务器的证书,若不信任该证书同样抛出异常。通过自己实现该方法,可以使之信任我们指定的任何证书。在实现该方法时,也可以简单的不做任何处理,即一个空的函数体,由于不会抛出异常,它就会信任任何证书。

        public void checkServerTrusted(X509Certificate[] chain, String authType)  

                throws CertificateException {  

        }  

        //返回受信任的X509证书数组。

        public X509Certificate[] getAcceptedIssuers() {  

            return new X509Certificate[] {};  

        }  

    }  

  

    private static class TrustAnyHostnameVerifier implements HostnameVerifier {  

        public boolean verify(String hostname, SSLSession session) {  

            return true;  

        }  

    }  

  

    /** 

     * post方式请求服务器(
a02f
https协议) 

     *  

     * @param url 

     *            请求地址 

     * @param content 

     *            参数 

     * @param charset 

     *            编码 

     * @return 

     * @throws NoSuchAlgorithmException 

     * @throws KeyManagementException 

     * @throws IOException 

     */  

    public static byte[] post(String url, String content, String charset)  

            throws NoSuchAlgorithmException, KeyManagementException,  

            IOException {  

    /*类HttpsURLConnection似乎并没有提供方法设置信任管理器。其实,HttpsURLConnection通过SSLSocket来建立与HTTPS的安全连接,SSLSocket对象是由SSLSocketFactory生成的。

    * HttpsURLConnection提供了方法setSSLSocketFactory(SSLSocketFactory)设置它使用的SSLSocketFactory对象。

    * SSLSocketFactory通过SSLContext对象来获得,在初始化SSLContext对象时,可指定信任管理器对象。

    * */

        SSLContext sc = SSLContext.getInstance("SSL");  

        sc.init(null, new TrustManager[] { new TrustAnyTrustManager() },  

                new java.security.SecureRandom());  

  

        URL console = new URL(url);  

        HttpsURLConnection conn = (HttpsURLConnection) console.openConnection();  

        conn.setSSLSocketFactory(sc.getSocketFactory());  

        conn.setHostnameVerifier(new TrustAnyHostnameVerifier());  

        conn.setDoOutput(true); 

        //设置请求头

        conn.setRequestProperty("Content-Type", "application/json;charset=utf-8");

        conn.connect();  

        DataOutputStream out = new DataOutputStream(conn.getOutputStream());  

        out.write(content.getBytes(charset));  

        // 刷新、关闭  

        out.flush();  

        out.close();  

        InputStream is = conn.getInputStream();  

        if (is != null) {  

            ByteArrayOutputStream outStream = new ByteArrayOutputStream();  

            byte[] buffer = new byte[1024];  

            int len = 0;  

            while ((len = is.read(buffer)) != -1) {  

                outStream.write(buffer, 0, len);  

            }  

            is.close();  

            return outStream.toByteArray();  

        }  

        return null;  

    } 

    public static void main(String[] args) throws KeyManagementException, NoSuchAlgorithmException, IOException{

    String url = "https://xxx.xxx.xxx/path/to/dir/${action}";

    PostJson pj = new PostJson();

    String content=pj.getbaowen();

    String charset="UTF-8";

   

    byte[] a = pj.post(url, content, charset);

    String b = new String(a);

    System.out.println(b);

   

    }

    //构造嵌套的JSON报文方式,即在new一个JSONObject,并返回报文字符串

    public  String getbaowen(){

    JSONObject test= new JSONObject();

    test.put("xxxx", "");

    String resp= null;

        JSONObject obj = new JSONObject();

        obj.put("xxxxxx", "");   

        obj.put("test", test);

        

        

        

       

        String query = obj.toString();

        return query;

    }

  

}  

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: