`

Java https请求 HttpsURLConnection

 
阅读更多

有关tomcat 6.0如何配置https服务的文章可以参考:http://blog.csdn.net/zhou_zion/article/details/6759171

以下主要讲解如何使用https发起post请求:

参考文档:梁栋前辈的《Java加密与解密的艺术》

 

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);
    }
}

 

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

 

<?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

 

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);
 }
}

 

转载:http://blog.csdn.net/csdnbenbenchong/article/details/7388260

 

 

分享到:
评论

相关推荐

    Https请求工具类,Java实现http请求,https请求

    Https请求工具类,Java实现http请求,https请求 本篇文章将详细介绍如何使用Java语言实现Http和Https请求的工具类,包括如何建立Https连接、如何实现Post请求、如何处理SSL验证等内容。 在Java中,使用...

    Java Https工具类,Java Https Post请求

    这个“Java Https工具类,Java Https Post请求”可能是一个自定义的类,用于简化发送HTTPS POST请求的过程。以下是对这个主题的详细讲解: 1. **HTTPS基础**: - HTTPS是在HTTP上添加了SSL/TLS(Secure Sockets ...

    Java发https请求证书问题

    ### Java 发送 HTTPS 请求时遇到证书问题解析 在进行网络通信的过程中,HTTPS 协议由于其安全性被广泛应用。本文将围绕“Java 发送 HTTPS 请求证书问题”这一主题展开讨论,通过对给定文件中的代码示例及操作步骤...

    java发送http/https请求(get/post)代码

    在Java编程中,发送HTTP和HTTPS请求是常见的网络通信任务,尤其在开发Web服务客户端或者进行API测试时。本文将详细讲解如何使用Java发送GET和POST请求,以及涉及的HTTPS安全连接。 首先,理解HTTP和HTTPS的区别至关...

    java 用HttpsURLConnection进行传递中文时错误总结

    首先,`HttpsURLConnection`是Java提供的一个类,用于通过HTTPS协议进行安全的HTTP通信。HTTPS是一种基于SSL/TLS协议的安全传输层,可以确保数据在传输过程中的安全性。然而,当传输包含中文字符的数据时,由于字符...

    java支持https的Post请求

    在Java编程环境中,进行HTTPS POST请求是常见的网络通信任务,特别是在需要安全传输敏感数据时,如用户登录信息或支付详情。HTTPS(HTTP over SSL/TLS)提供了加密和身份验证机制,确保了数据的隐私和完整性。本文将...

    java https请求

    在Java 3.x和4.x版本中,处理HTTPS请求的方法虽然与HTTP基本类似,但需要额外考虑安全性和证书管理。 一、Java HTTPS请求的基本步骤 1. 导入相关库:在进行HTTPS请求之前,需要导入`javax.net.ssl`和`java.net`这...

    Java HttpsURLConnection的使用

    总结来说,`HttpsURLConnection`是Java进行HTTPS通信的重要工具,它的使用涉及网络连接的建立、SSL配置、请求和响应的处理。了解并熟练掌握这一部分知识对于开发涉及网络交互的Java应用程序至关重要。在源码分析和...

    Java下载https文件并上传阿里云oss服务器

    首先,Java下载HTTPS文件涉及到网络请求和安全证书的处理。HTTPS(Hypertext Transfer Protocol Secure)是一种加密的通信协议,用于在互联网上安全地传输数据。由于HTTPS采用TLS/SSL协议,因此需要处理服务器的数字...

    java开发https请求ssl不受信任问题解决方法

    Java 开发 HTTPS 请求 SSL 不受信任问题解决方法 在 Java 开发中,使用 HTTPS 请求时可能会遇到 SSL 不受信任的问题,这是因为 Java 的证书验证机制会检查目标服务器的证书是否合法,如果证书不合法或没有证书就会...

    Java发送https请求代码实例

    在Java中发送HTTPS请求需要使用`HttpsURLConnection`类,该类继承自`URLConnection`类,是专门用于HTTPS请求的类。`HttpsURLConnection`类提供了多种方法来发送HTTPS请求,例如设置请求方法、设置请求头、设置请求体...

    HTTPS请求+java

    Java作为广泛使用的编程语言,提供了丰富的API来实现HTTPS请求。本文将深入探讨如何使用Java进行HTTPS请求,以及涉及的相关知识点。 首先,理解HTTPS的基本原理至关重要。HTTPS在HTTP的基础上加入了SSL(Secure ...

    android客户端发送https请求

    6. **发起HTTPS请求**:现在HttpClient已经配置好,可以正常发送HTTPS请求了。例如,发送GET请求: ```java HttpGet request = new HttpGet(url); HttpResponse response = httpClient.execute(request); ``` 7...

    java实现读取证书访问https接口

    然后,在`testUtils.java`中,可能包含了一些测试和辅助函数,比如创建`HttpsURLConnection`或`HttpClient`实例,设置SSL上下文,以及进行HTTP请求的逻辑: ```java public class TestUtils { public static ...

    java访问https网址下载文件

    Java的`HttpURLConnection`类是处理HTTP和HTTPS请求的基础,而`HttpsURLConnection`则是它的HTTPS特定实现。 1. **配置SSL上下文**: 当访问HTTPS网址时,Java会检查服务器的SSL证书。如果证书不在受信任的证书...

    android studio实现HttpsURLConnection post请求的发送并接收

    总结起来,Android Studio中的`HttpsURLConnection`是实现POST请求的关键工具,通过配置连接、写入请求体和读取响应,可以安全地与HTTPS服务器进行交互。理解这些步骤并能灵活运用,对于任何Android开发者来说都是至...

    Java中的SSL及HTTPS协议实例源码

    这个简单的示例展示了如何使用Java的`HttpsURLConnection`发起一个HTTPS请求,获取并打印服务器的响应。在实际应用中,可能还需要处理证书验证、自定义SSLContext等更复杂的场景。 总的来说,理解Java中的SSL和...

    java 发送http和https请求的实例.docx

    ### Java 发送 HTTP 和 HTTPS 请求详解 #### 一、引言 在现代软件开发中,客户端与服务端之间的通信通常是通过 HTTP 或 HTTPS 协议来完成的。Java 作为一种广泛使用的编程语言,提供了多种方式来实现 HTTP 和 HTTPS...

    java 调用https webservice实例及axis包

    在Java开发中,调用HTTPS发布的Web Service接口是一项常见的任务,尤其在企业级应用中,HTTPS提供了安全的数据传输。本文将详细介绍如何使用Apache Axis库来实现这一功能,并提供相关步骤和注意事项。 首先,理解...

Global site tag (gtag.js) - Google Analytics