浏览器可以作为客户端向服务器发送Http请求,当需要访问后台或第三方Restful接口时,也可以用java实现客户端直接发get/post请求,获取数据。

https客户端


import javax.net.ssl.HttpsURLConnection;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.URL;
import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException; /**
* 基于HttpsURLConnection实现客户端https请求
*
*/
public class HttpsClientDemo {
private static final String METHOD_GET = "GET";
private static final String METHOD_POST = "POST"; /**
* doGet
*/
private static void httpsGet(String url) throws NoSuchAlgorithmException, KeyManagementException, IOException {
// 创建连接对象
HttpsURLConnection connection = getHttpsURLConnection(url, METHOD_GET);
connection.connect();
System.out.println("cipersuit used:" + connection.getCipherSuite()); // 读取连接响应内容
getresponse(connection);
} /**
* doPost
*/
private static void httpsPost(String url, String params) throws NoSuchAlgorithmException, IOException, KeyManagementException {
// 创建连接对象
HttpsURLConnection connection = getHttpsURLConnection(url, METHOD_POST);
// 发送POST请求必须设置如下两行
connection.setDoOutput(true);
connection.setDoInput(true);
connection.connect(); // 获取URLConnection对象对应的输出流
PrintWriter out = null;
try {
out = new PrintWriter(connection.getOutputStream());
// 发送请求参数
out.print(params);
out.flush();
} finally {
if (out != null) {
out.close();
}
}
getresponse(connection);
} /**
* 读取连接响应内容
*/
private static void getresponse(HttpsURLConnection connection) throws IOException { BufferedReader br = null;
try {
br = new BufferedReader(new InputStreamReader(connection.getInputStream(), "UTF-8"));
String inputLine;
StringBuilder sb = new StringBuilder();
while ((inputLine = br.readLine()) != null) {
sb.append(inputLine);
}
System.out.println(sb.toString());
System.out.println("responseMsg:" + connection.getResponseMessage() + "; responseCode:" + connection.getResponseCode());
} finally {
if (br != null) {
br.close();
}
}
} /**
* 获取连接对象
*/
private static HttpsURLConnection getHttpsURLConnection(String url, String method) throws IOException, NoSuchAlgorithmException, KeyManagementException {
URL myUrl = new URL(url);
// 创建连接对象
HttpsURLConnection connection = (HttpsURLConnection) myUrl.openConnection();
connection.setRequestMethod(method);
// 设置SSLSocketFactory对象(若不指定算法套,getSslContext().getSocketFactory()即可)
connection.setSSLSocketFactory(new MySSLSocketFactory());
// 验证hostname,全部允许
connection.setHostnameVerifier((hostname, sslSession) -> true); // 设置通用请求属性
connection.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.84 Safari/537.36");
connection.setRequestProperty("Connection", "Keep-Alive");
connection.setRequestProperty("Charset", "UTF-8"); return connection;
} public static void main(String[] args) throws Exception {
String url = "https://***"; httpsGet(url);
// httpsPost(url, "username=admin&password=admin@1234&forceLogin=false");
}
}

指定ssl算法套

如果是需要设置客户端算法套,可以通过继承SSLSocketFactory重写其createSocket()方法,自行设置SSL算法套。

import javax.net.ssl.*;
import java.io.IOException;
import java.net.InetAddress;
import java.net.Socket;
import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate; /**
* 重写createSocket方法,设置算法套
*/
public class MySSLSocketFactory extends SSLSocketFactory {
private static final String[] cipherSuites = new String[]{
"TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384",
"TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256"}; private static SSLContext sslContext = null; // 设置算法套
private void setSSLParams(SSLSocket sslSocket) {
sslSocket.setUseClientMode(true);
sslSocket.setEnabledCipherSuites(cipherSuites);
} /**
* 创建SSLContext对象,使用默认信任管理器初始化
*/
private static SSLContext getSslContext() {
if (sslContext == null) {
try {
sslContext = SSLContext.getInstance("TLSv1.2");
sslContext.init(new KeyManager[0], new TrustManager[]{new DefaultTrustManager()}, new SecureRandom());
} catch (NoSuchAlgorithmException | KeyManagementException e) {
e.printStackTrace();
}
SSLContext.setDefault(sslContext);
}
return sslContext;
} @Override
public String[] getDefaultCipherSuites() {
return cipherSuites;
} @Override
public String[] getSupportedCipherSuites() {
return cipherSuites;
} @Override
public Socket createSocket(Socket socket, String host, int port, boolean b) throws IOException {
SSLSocket sslSocket = (SSLSocket) getSslContext().getSocketFactory().createSocket(socket, host, port, b);
setSSLParams(sslSocket);
return sslSocket;
} @Override
public Socket createSocket(String host, int port) throws IOException {
SSLSocket sslSocket = (SSLSocket) getSslContext().getSocketFactory().createSocket(host, port);
setSSLParams(sslSocket);
return sslSocket;
} @Override
public Socket createSocket(String host, int port, InetAddress localHost, int localPort) throws IOException {
SSLSocket sslSocket = (SSLSocket) getSslContext().getSocketFactory().createSocket(host, port, localHost, localPort);
setSSLParams(sslSocket);
return sslSocket;
} @Override
public Socket createSocket(InetAddress host, int port) throws IOException {
SSLSocket sslSocket = (SSLSocket) getSslContext().getSocketFactory().createSocket(host, port);
setSSLParams(sslSocket);
return sslSocket;
} @Override
public Socket createSocket(InetAddress address, int port, InetAddress localAddress, int localPort) throws IOException {
SSLSocket sslSocket = (SSLSocket) getSslContext().getSocketFactory().createSocket(address, port, localAddress, localPort);
setSSLParams(sslSocket);
return sslSocket;
} /**
* SSL信任管理类
*/
private static class DefaultTrustManager implements X509TrustManager { @Override
public void checkClientTrusted(X509Certificate[] arg0, String arg1) throws CertificateException {
} @Override
public void checkServerTrusted(X509Certificate[] arg0, String arg1) throws CertificateException {
} @Override
public X509Certificate[] getAcceptedIssuers() {
return null;
} } }

HTTPS客户端的java实现的更多相关文章

  1. JAVA Socket 实现HTTP与HTTPS客户端发送POST与GET方式请求

    JAVA Socket 实现HTTP与HTTPS客户端发送POST与GET方式请求 哇,一看标题怎么这么长啊,其实意思很简单,哥讨厌用HTTP Client做POST与GET提交 觉得那个毕竟是别人写 ...

  2. C#使用Thrift简介,C#客户端和Java服务端相互交互

    C#使用Thrift简介,C#客户端和Java服务端相互交互 本文主要介绍两部分内容: C#中使用Thrift简介 用Java创建一个服务端,用C#创建一个客户端通过thrift与其交互. 用纯C#实 ...

  3. Java与WCF交互(二):WCF客户端调用Java web service【转】

    原文:http://www.cnblogs.com/downmoon/archive/2010/08/25/1807982.html 在上篇< Java与WCF交互(一):Java客户端调用WC ...

  4. 转载——Java与WCF交互(二):WCF客户端调用Java Web Service

    在上篇< Java与WCF交互(一):Java客户端调用WCF服务>中,我介绍了自己如何使用axis2生成java客户端的悲惨经历.有同学问起使用什么协议,经初步验证,发现只有wsHttp ...

  5. 客户端使用java,服务端使用c++的corba编程环境搭建

    我们先用c++实现服务端和客户端,然后再用java编写客户端. 1. 首先安装omniORB,omniORB提供 omniidl命令,以及一些头文件和库. omniORB一般是需要你自己进行编译. 2 ...

  6. .net 客户端调用java或.net webservice进行soapheader验证

    .net 客户端调用java或.net webservice进行soapheader验证 最近项目中有业务需要跨平台调用web服务,客户端和服务器之间采用非对称加密来保证数据的安全性,webservi ...

  7. log4j的1.2.15版本,在pom.xml中的顶层project报错错误: Failure to transfer javax.jms:jms:jar:1.1 from https://maven-repository.dev.java.net/nonav/repository......

    在动态网站工程中,添加了Pom依赖,当添加log4j的1.2.15版本依赖时,在pom.xml中的顶层project报错错误: Failure to transfer javax.jms:jms:ja ...

  8. Hbase入门(五)——客户端(Java,Shell,Thrift,Rest,MR,WebUI)

    Hbase的客户端有原生java客户端,Hbase Shell,Thrift,Rest,Mapreduce,WebUI等等. 下面是这几种客户端的常见用法. 一.原生Java客户端 原生java客户端 ...

  9. java https客户端请求

    String pathname = Test3.class.getResource("/client.jks").getFile(); System.out.println(pat ...

随机推荐

  1. webpack 添加eslint代码审查

    1). 添加包 npm install eslint --save-dev npm install eslint-loader --save-dev npm install eslint-plugin ...

  2. AcWing 156. 矩阵 (哈希二维转一维查询)打卡

    给定一个M行N列的01矩阵(只包含数字0或1的矩阵),再执行Q次询问,每次询问给出一个A行B列的01矩阵,求该矩阵是否在原矩阵中出现过. 输入格式 第一行四个整数M,N,A,B. 接下来一个M行N列的 ...

  3. LINIX上Nginx的从零安装

    源码编译方式: #一般系统中已经装了了make和g++,无须再装 安装make: yum -y install autoconf automake make 安装g++: yum -y install ...

  4. VS2012编译WDM驱动

    新版的VS2012中集成了WDK8,而且WDK8中已经没有之前的Build Environment了,看来编译驱动只能通过VS2012了,直接开发WDF驱动很方便直接选取相应的模板即可,若是编译以前的 ...

  5. 戏说 .NET GDI+系列学习教程(三、Graphics类的应用_自定义控件--主要用于画面拖拽效果)

    如题,需求:在某个图片上用户可以手动指定位置. 如下: 中心思想:仿照Visual Studio工具中的控件的做法 如何仿照呢? 1.自定义的控件类继承System.Windows.Forms.Con ...

  6. spring中的web上下文,spring上下文,springmvc上下文区别(超详细)

    web上下文(Servlet context),spring上下文(WebApplication Context),springmvc上下文(mlWebApplicationCont)之间区别. 上下 ...

  7. CodeForces1249E-By Elevator or Stairs?-好理解自己想不出来的dp

    Input The first line of the input contains two integers nn and cc (2≤n≤2⋅105,1≤c≤10002≤n≤2⋅105,1≤c≤1 ...

  8. 【Linux】- Systemd 命令篇

    转自:阮一峰的网络日志 Systemd 是 Linux 系统工具,用来启动守护进程,已成为大多数发行版的标准配置. 一.由来 历史上,Linux 的启动一直采用init进程. 下面的命令用来启动服务. ...

  9. ajax的两种应用方式

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  10. 制作一个自己的xhprof测试平台

    1 1.首先安装php开发环境,比如lnmp. 2.安装xhprof ps: 记住从github上面下载(https://github.com/phacility/xhprof), 不要从pecl.p ...