175 lines
5.7 KiB
Java
175 lines
5.7 KiB
Java
|
|
package com.zhgd.xmgl.util;
|
|||
|
|
|
|||
|
|
import javax.net.ssl.*;
|
|||
|
|
import java.io.*;
|
|||
|
|
import java.net.HttpURLConnection;
|
|||
|
|
import java.net.URL;
|
|||
|
|
import java.security.cert.CertificateException;
|
|||
|
|
import java.security.cert.X509Certificate;
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 处理https的图片
|
|||
|
|
*/
|
|||
|
|
public class X509TrustManagerUtil implements X509TrustManager {
|
|||
|
|
/**
|
|||
|
|
* 从网络的url图片保存在本地
|
|||
|
|
*
|
|||
|
|
* @param urlStr
|
|||
|
|
* @param fileName
|
|||
|
|
* @param savePath
|
|||
|
|
* @throws Exception
|
|||
|
|
*/
|
|||
|
|
public static void downLoadFromUrlHttps(String urlStr, String fileName,
|
|||
|
|
String savePath) throws Exception {
|
|||
|
|
// 创建SSLContext
|
|||
|
|
SSLContext sslContext = SSLContext.getInstance("SSL");
|
|||
|
|
TrustManager[] tm = {new X509TrustManagerUtil()};
|
|||
|
|
// 初始化
|
|||
|
|
sslContext.init(null, tm, new java.security.SecureRandom());
|
|||
|
|
// 获取SSLSocketFactory对象
|
|||
|
|
SSLSocketFactory ssf = sslContext.getSocketFactory();
|
|||
|
|
// url对象
|
|||
|
|
URL url = new URL(urlStr);
|
|||
|
|
// 打开连接
|
|||
|
|
HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
|
|||
|
|
/**
|
|||
|
|
* 这一步的原因: 当访问HTTPS的网址。您可能已经安装了服务器证书到您的JRE的keystore
|
|||
|
|
* 但是服务器的名称与证书实际域名不相等。这通常发生在你使用的是非标准网上签发的证书。
|
|||
|
|
*
|
|||
|
|
* 解决方法:让JRE相信所有的证书和对系统的域名和证书域名。
|
|||
|
|
*
|
|||
|
|
* 如果少了这一步会报错:java.io.IOException: HTTPS hostname wrong: should be <localhost>
|
|||
|
|
*/
|
|||
|
|
conn.setHostnameVerifier(new X509TrustManagerUtil().new TrustAnyHostnameVerifier());
|
|||
|
|
// 设置一些参数
|
|||
|
|
conn.setDoOutput(true);
|
|||
|
|
conn.setDoInput(true);
|
|||
|
|
conn.setUseCaches(false);
|
|||
|
|
// 设置当前实例使用的SSLSoctetFactory
|
|||
|
|
conn.setSSLSocketFactory(ssf);
|
|||
|
|
conn.connect();
|
|||
|
|
|
|||
|
|
|
|||
|
|
// 得到输入流
|
|||
|
|
InputStream inputStream = conn.getInputStream();
|
|||
|
|
byte[] getData = readInputStream(inputStream);
|
|||
|
|
// 文件保存位置
|
|||
|
|
File saveDir = new File(savePath);
|
|||
|
|
if (!saveDir.exists()) {
|
|||
|
|
saveDir.mkdirs();
|
|||
|
|
}
|
|||
|
|
//输出流
|
|||
|
|
File file = new File(saveDir + File.separator + fileName);
|
|||
|
|
FileOutputStream fos = new FileOutputStream(file);
|
|||
|
|
fos.write(getData);
|
|||
|
|
if (fos != null) {
|
|||
|
|
fos.close();
|
|||
|
|
}
|
|||
|
|
if (inputStream != null) {
|
|||
|
|
inputStream.close();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 从网络http类型Url中下载文件
|
|||
|
|
*
|
|||
|
|
* @param urlStr
|
|||
|
|
* @param fileName
|
|||
|
|
* @param savePath
|
|||
|
|
* @throws IOException
|
|||
|
|
*/
|
|||
|
|
public static void downLoadFromUrlHttp(String urlStr, String fileName,
|
|||
|
|
String savePath) throws IOException {
|
|||
|
|
URL url = new URL(urlStr);
|
|||
|
|
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
|
|||
|
|
// 设置超时间为3秒
|
|||
|
|
conn.setConnectTimeout(3 * 1000);
|
|||
|
|
// 防止屏蔽程序抓取而返回403错误
|
|||
|
|
conn.setRequestProperty("User-Agent",
|
|||
|
|
"Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)");
|
|||
|
|
conn.connect();
|
|||
|
|
|
|||
|
|
// 得到输入流
|
|||
|
|
InputStream inputStream = conn.getInputStream();
|
|||
|
|
byte[] getData = readInputStream(inputStream);
|
|||
|
|
// 文件保存位置
|
|||
|
|
File saveDir = new File(savePath);
|
|||
|
|
if (!saveDir.exists()) {
|
|||
|
|
saveDir.mkdirs();
|
|||
|
|
}
|
|||
|
|
// 输出流
|
|||
|
|
File file = new File(saveDir + File.separator + fileName);
|
|||
|
|
FileOutputStream fos = new FileOutputStream(file);
|
|||
|
|
fos.write(getData);
|
|||
|
|
if (fos != null) {
|
|||
|
|
fos.close();
|
|||
|
|
}
|
|||
|
|
if (inputStream != null) {
|
|||
|
|
inputStream.close();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 从输入流中获取字节数组
|
|||
|
|
*
|
|||
|
|
* @param inputStream
|
|||
|
|
* @return
|
|||
|
|
* @throws IOException
|
|||
|
|
*/
|
|||
|
|
public static byte[] readInputStream(InputStream inputStream)
|
|||
|
|
throws IOException {
|
|||
|
|
byte[] b = new byte[1024];
|
|||
|
|
int len = 0;
|
|||
|
|
ByteArrayOutputStream bos = new ByteArrayOutputStream();
|
|||
|
|
while ((len = inputStream.read(b)) != -1) {
|
|||
|
|
bos.write(b, 0, len);
|
|||
|
|
}
|
|||
|
|
bos.close();
|
|||
|
|
return bos.toByteArray();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
/***
|
|||
|
|
* 校验https网址是否安全
|
|||
|
|
*
|
|||
|
|
* @author solexit06
|
|||
|
|
*
|
|||
|
|
*/
|
|||
|
|
public class TrustAnyHostnameVerifier implements HostnameVerifier {
|
|||
|
|
public boolean verify(String hostname, SSLSession session) {
|
|||
|
|
// 直接返回true:默认所有https请求都是安全的
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
/*
|
|||
|
|
* 里面的方法都是空的,当方法为空是默认为所有的链接都为安全,也就是所有的链接都能够访问到 当然这样有一定的安全风险,可以根据实际需要写入内容
|
|||
|
|
*/
|
|||
|
|
public void checkClientTrusted(X509Certificate[] chain, String authType)
|
|||
|
|
throws CertificateException {
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
public void checkServerTrusted(X509Certificate[] chain, String authType)
|
|||
|
|
throws CertificateException {
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
public X509Certificate[] getAcceptedIssuers() {
|
|||
|
|
return null;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public static void main(String[] args) {
|
|||
|
|
String name = "C:/Users/solexit06/Desktop/test/";
|
|||
|
|
String urls = "https://116.205.128.251:6113/pic?7db681653a5do-5el*31-25976b8-98c2cabbf**b11===sp**812=9t0470280244=7l0*4010=6ob*521e-7pi114o=2dcb2=15a&AccessKeyId=FOZAuZC0Dc84QjvL&Expires=1709893202&Signature=lJnNS138ZVoPwOar6T4QROyg590=";
|
|||
|
|
try {
|
|||
|
|
downLoadFromUrlHttps(urls, "1.png", name);
|
|||
|
|
} catch (Exception e) {
|
|||
|
|
e.printStackTrace();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|