A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

原文地址为:Java 发送https 的post请求方法

  • import java.io.BufferedReader;  
  • import java.io.FileInputStream;  
  • import java.io.IOException;  
  • import java.io.InputStreamReader;  
  • import java.net.MalformedURLException;  
  • import java.net.URL;  
  • import java.security.GeneralSecurityException;  
  • import java.security.KeyStore;  
  •   
  • import javax.net.ssl.HostnameVerifier;  
  • import javax.net.ssl.HttpsURLConnection;  
  • import javax.net.ssl.KeyManagerFactory;  
  • import javax.net.ssl.SSLContext;  
  • import javax.net.ssl.TrustManagerFactory;  
  •   
  • public class HttpsPost {  
  •     /**
  •      * 获得KeyStore.
  •      * @param keyStorePath
  •      *            密钥库路径
  •      * @param password
  •      *            密码
  •      * @return 密钥库
  •      * @throws Exception
  •      */  
  •     public static KeyStore getKeyStore(String password, String keyStorePath)  
  •             throws Exception {  
  •         // 实例化密钥库  
  •         KeyStore ks = KeyStore.getInstance("JKS");  
  •         // 获得密钥库文件流  
  •         FileInputStream is = new FileInputStream(keyStorePath);  
  •         // 加载密钥库  
  •         ks.load(is, password.toCharArray());  
  •         // 关闭密钥库文件流  
  •         is.close();  
  •         return ks;  
  •     }  
  •   
  •     /**
  •      * 获得SSLSocketFactory.
  •      * @param password
  •      *            密码
  •      * @param keyStorePath
  •      *            密钥库路径
  •      * @param trustStorePath
  •      *            信任库路径
  •      * @return SSLSocketFactory
  •      * @throws Exception
  •      */  
  •     public static SSLContext getSSLContext(String password,  
  •             String keyStorePath, String trustStorePath) throws Exception {  
  •         // 实例化密钥库  
  •         KeyManagerFactory keyManagerFactory = KeyManagerFactory  
  •                 .getInstance(KeyManagerFactory.getDefaultAlgorithm());  
  •         // 获得密钥库  
  •         KeyStore keyStore = getKeyStore(password, keyStorePath);  
  •         // 初始化密钥工厂  
  •         keyManagerFactory.init(keyStore, password.toCharArray());  
  •   
  •         // 实例化信任库  
  •         TrustManagerFactory trustManagerFactory = TrustManagerFactory  
  •                 .getInstance(TrustManagerFactory.getDefaultAlgorithm());  
  •         // 获得信任库  
  •         KeyStore trustStore = getKeyStore(password, trustStorePath);  
  •         // 初始化信任库  
  •         trustManagerFactory.init(trustStore);  
  •         // 实例化SSL上下文  
  •         SSLContext ctx = SSLContext.getInstance("TLS");  
  •         // 初始化SSL上下文  
  •         ctx.init(keyManagerFactory.getKeyManagers(),  
  •                 trustManagerFactory.getTrustManagers(), null);  
  •         // 获得SSLSocketFactory  
  •         return ctx;  
  •     }  
  •   
  •     /**
  •      * 初始化HttpsURLConnection.
  •      * @param password
  •      *            密码
  •      * @param keyStorePath
  •      *            密钥库路径
  •      * @param trustStorePath
  •      *            信任库路径
  •      * @throws Exception
  •      */  
  •     public static void initHttpsURLConnection(String password,  
  •             String keyStorePath, String trustStorePath) throws Exception {  
  •         // 声明SSL上下文  
  •         SSLContext sslContext = null;  
  •         // 实例化主机名验证接口  
  •         HostnameVerifier hnv = new MyHostnameVerifier();  
  •         try {  
  •             sslContext = getSSLContext(password, keyStorePath, trustStorePath);  
  •         } catch (GeneralSecurityException e) {  
  •             e.printStackTrace();  
  •         }  
  •         if (sslContext != null) {  
  •             HttpsURLConnection.setDefaultSSLSocketFactory(sslContext  
  •                     .getSocketFactory());  
  •         }  
  •         HttpsURLConnection.setDefaultHostnameVerifier(hnv);  
  •     }  
  •   
  •     /**
  •      * 发送请求.
  •      * @param httpsUrl
  •      *            请求的地址
  •      * @param xmlStr
  •      *            请求的数据
  •      */  
  •     public static void post(String httpsUrl, String xmlStr) {  
  •         HttpsURLConnection urlCon = null;  
  •         try {  
  •             urlCon = (HttpsURLConnection) (new URL(httpsUrl)).openConnection();  
  •             urlCon.setDoInput(true);  
  •             urlCon.setDoOutput(true);  
  •             urlCon.setRequestMethod("POST");  
  •             urlCon.setRequestProperty("Content-Length",  
  •                     String.valueOf(xmlStr.getBytes().length));  
  •             urlCon.setUseCaches(false);  
  •             //设置为gbk可以解决服务器接收时读取的数据中文乱码问题  
  •             urlCon.getOutputStream().write(xmlStr.getBytes("gbk"));  
  •             urlCon.getOutputStream().flush();  
  •             urlCon.getOutputStream().close();  
  •             BufferedReader in = new BufferedReader(new InputStreamReader(  
  •                     urlCon.getInputStream()));  
  •             String line;  
  •             while ((line = in.readLine()) != null) {  
  •                 System.out.println(line);  
  •             }  
  •         } catch (MalformedURLException e) {  
  •             e.printStackTrace();  
  •         } catch (IOException e) {  
  •             e.printStackTrace();  
  •         } catch (Exception e) {  
  •             e.printStackTrace();  
  •         }  
  •     }  
  •   
  •     /**
  •      * 测试方法.
  •      * @param args
  •      * @throws Exception
  •      */  
  •     public static void main(String[] args) throws Exception {  
  •         // 密码  
  •         String password = "123456";  
  •         // 密钥库  
  •         String keyStorePath = "tomcat.keystore";  
  •         // 信任库  
  •         String trustStorePath = "tomcat.keystore";  
  •         // 本地起的https服务  
  •         String httpsUrl = "https://localhost:8443/service/httpsPost";  
  •         // 传输文本  
  •         String xmlStr = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><fruitShop><fruits><fruit><kind>萝卜</kind></fruit><fruit><kind>菠萝</kind></fruit></fruits></fruitShop>";  
  •         HttpsPost.initHttpsURLConnection(password, keyStorePath, trustStorePath);  
  •         // 发起请求  
  •         HttpsPost.post(httpsUrl, xmlStr);  
  •     }  
  • }  


[java]  view plain copy




  • import javax.net.ssl.HostnameVerifier;  
  • import javax.net.ssl.SSLSession;  
  •   
  • /**
  • * 实现用于主机名验证的基接口。  
  • * 在握手期间,如果 URL 的主机名和服务器的标识主机名不匹配,则验证机制可以回调此接口的实现程序来确定是否应该允许此连接。
  • */  
  • public class MyHostnameVerifier implements HostnameVerifier {  
  •     @Override  
  •     public boolean verify(String hostname, SSLSession session) {  
  •         if("localhost".equals(hostname)){  
  •             return true;  
  •         } else {  
  •             return false;  
  •         }  
  •     }  
  • }  


接收请求的Web应用:

web.xml


[html]  view plain copy




  • <?xml version="1.0" encoding="UTF-8"?>  
  • <web-app version="2.5"   
  •     xmlns="http://java.sun.com/xml/ns/javaee"   
  •     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   
  •     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee   
  •     http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">  
  •   <servlet>  
  •     <servlet-name>rollBack</servlet-name>  
  •     <servlet-class>rollBack</servlet-class>  
  •   </servlet>  
  •   
  •   <servlet-mapping>  
  •     <servlet-name>rollBack</servlet-name>  
  •     <url-pattern>/httpsPost</url-pattern>  
  •   </servlet-mapping>  
  •   <welcome-file-list>  
  •     <welcome-file>index.jsp</welcome-file>  
  •   </welcome-file-list>  
  • </web-app>  


rollBack servlet

[java]  view plain copy




  • import java.io.BufferedReader;  
  • import java.io.IOException;  
  • import java.io.InputStreamReader;  
  •   
  • import javax.servlet.ServletException;  
  • import javax.servlet.ServletInputStream;  
  • import javax.servlet.http.HttpServlet;  
  • import javax.servlet.http.HttpServletRequest;  
  • import javax.servlet.http.HttpServletResponse;  
  •   
  •   
  • public class rollBack extends HttpServlet {  
  •   
  •     public void doGet(HttpServletRequest request, HttpServletResponse response)  
  •             throws ServletException, IOException {  
  •         //获取请求流  
  •         ServletInputStream sis = request.getInputStream();  
  •         BufferedReader in = new BufferedReader(new InputStreamReader(sis));  
  •         String line;  
  •         if((line = in.readLine()) != null){  
  •             System.out.println(line);  
  •         }  
  •         in.close();  
  •     }  
  •   
  •     public void doPost(HttpServletRequest request, HttpServletResponse response)  
  •             throws ServletException, IOException {  
  •         this.doGet(request, response);  
  •     }  
  • }  



【转载】原文地址:Java 发送https 的post请求方法

3 个回复

倒序浏览
回复 使用道具 举报
虽然我看不懂但还是顶楼主一下
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马