过滤证书信任工具类:
public class SslVerifyUtil {
public static void trustAllHttpsCertificates() throws Exception {
javax.net.ssl.TrustManager[] trustAllCerts = new javax.net.ssl.TrustManager[1];
javax.net.ssl.TrustManager tm = new miTM();
trustAllCerts[0] = tm;
javax.net.ssl.SSLContext sc = javax.net.ssl.SSLContext.getInstance("SSL");
sc.init(null, trustAllCerts, null);
javax.net.ssl.HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
}
static class miTM implements javax.net.ssl.TrustManager, javax.net.ssl.X509TrustManager {
@Override
public java.security.cert.X509Certificate[] getAcceptedIssuers() {
return null;
}
public boolean isServerTrusted(java.security.cert.X509Certificate[] certs) {
return true;
}
public boolean isClientTrusted(java.security.cert.X509Certificate[] certs) {
return true;
}
@Override
public void checkServerTrusted(java.security.cert.X509Certificate[] certs, String authType)
throws java.security.cert.CertificateException {
return;
}
@Override
public void checkClientTrusted(java.security.cert.X509Certificate[] certs, String authType)
throws java.security.cert.CertificateException {
return;
}
}
}
访问第三方图片url地址并获取文件流:
@SneakyThrows
@Override
public void getFileIoByImageUrl(String path, HttpServletRequest request, HttpServletResponse response) {
/**
* 备选方案:直接通过第三方图片的url地址获取到输入流
* 目前采用方案:先根据url地址将文件下载,从本地路径读取输入流,读取完之后再将文件删除;
* 这种方式接口的 响应时间 比从直接通过第三方图片的url地址获取到输入流的方式 快一些
*/
//getInputStreamByUrl(备选方案方法);
//临时目录
String tempPath = tempFile + "xxx.jpg";
String pictureRealUrl = 第三方图片url地址;
//根据第三方url地址下载图片到本地临时目录
File file1 = downloadFileService.downloadFileFromNetWork(pictureRealUrl, tempPath);
OutputStream toClient = null;
try {
InputStream fis = new BufferedInputStream(new FileInputStream(tempPath));
byte[] buffer = new byte[fis.available()];
fis.read(buffer);
fis.close();
response.reset();
// 设置response的Header
response.addHeader("Content-Length", "" + file1.length());
response.setContentType("image/jpg");
toClient= new BufferedOutputStream(response.getOutputStream());
toClient.write(buffer);
toClient.flush();
toClient.close();
if(file1 !=null){
file1.delete();
}
} catch (Exception e) {
e.printStackTrace();
}finally {
if(toClient !=null){
toClient.flush();
toClient.close();
}
}
}
备选方案代码:
public static InputStream getInputStreamByUrl(String strUrl) {
HttpURLConnection conn = null;
try {
//过滤证书信任
SslVerifyUtil.trustAllHttpsCertificates();
HostnameVerifier hv = new HostnameVerifier() {
@Override
public boolean verify(String urlHostName, SSLSession session) {
log.info("Warning: URL Host: " + urlHostName + " vs. " + session.getPeerHost());
return true;
}
};
URL url = new URL(strUrl);
conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");
conn.setConnectTimeout(20 * 1000);
final ByteArrayOutputStream output = new ByteArrayOutputStream();
IOUtils.copy(conn.getInputStream(), output);
return new ByteArrayInputStream(output.toByteArray());
} catch (Exception e) {
log.error(e + "");
} finally {
try {
if (conn != null) {
conn.disconnect();
}
} catch (Exception e) {
log.error(e + "");
}
}
return null;
}
downloadFileFromNetWork方法代码:
@SneakyThrows
@Override
@Nls
public File downloadFileFromNetWork(@NotNull String imgUrl, @NotNull String localPath) {
File file = new File(localPath);
if(file.exists()) {
return file;
}
//过滤证书信任问题
SslVerifyUtil.trustAllHttpsCertificates();
HostnameVerifier hv = new HostnameVerifier() {
@Override
public boolean verify(String urlHostName, SSLSession session) {
log.info("Warning: URL Host: " + urlHostName + " vs. " + session.getPeerHost());
return true;
}
};
InputStream inputStream = downloadInsFromNetWork(imgUrl);
if(inputStream != null) {
FileOutputStream fos = null;
try {
if(!file.exists()) {
if(!file.getParentFile().exists()) {
file.getParentFile().mkdirs();
}
file.createNewFile();
}
int index;
byte[] bytes = new byte[1024];
fos = new FileOutputStream(file);
while ((index = inputStream.read(bytes)) != -1) {
fos.write(bytes, 0, index);
fos.flush();
}
return file;
} finally {
if(fos != null) {
fos.close();
}
inputStream.close();
}
}
return null;
}
downloadInsFromNetWork方法代码:
public InputStream downloadInsFromNetWork(@NotNull String imgUrl) {
URL url;
URLConnection connection;
try {
url = new URL(imgUrl);
connection = url.openConnection();
} catch (IOException e) {
return null;
}
connection.setConnectTimeout(3000);
connection.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)");
InputStream imgIs = null;
try {
imgIs = connection.getInputStream();
} catch (IOException e) {
}
return imgIs;
}
最后
以上就是爱撒娇天空最近收集整理的关于java后台访问第三方图片资源,过滤证书信任问题,并且返回文件流(直接访问第三方资源,需要在浏览器安装证书)的全部内容,更多相关java后台访问第三方图片资源内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复