目标:java controller访问https://xxxx/xxxx.html,以流的形式直接返回该页面
1.添加信任管理器类
public class MyX509TrustManager implements X509TrustManager {
// 检查客户端证书
public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
}
// 检查服务器端证书
public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
}
// 返回受信任的X509证书数组
public X509Certificate[] getAcceptedIssuers() {
return null;
}
public class TrustAnyHostnameVerifier implements HostnameVerifier {
@Override
public boolean verify(String s, SSLSession sslSession) {
// 直接返回true:默认所有https请求都是安全的
return true;
}
}
}
2.controller
@Override
public String getRobotPage(HttpServletResponse response, String url){
try{
response.setContentType("multipart/form-data");
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html");
// 2.设置文件头:最后一个参数是设置下载文件名
ServletOutputStream out;
//访问https下的文件
// 创建SSLContext
SSLContext sslContext = SSLContext.getInstance("SSL");
TrustManager[] tm = { new MyX509TrustManager() };
// 初始化
sslContext.init(null, tm, new java.security.SecureRandom());
;
// 获取SSLSocketFactory对象
SSLSocketFactory ssf = sslContext.getSocketFactory();
// url对象
URL url = new URL(url);
// 打开连接
HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
/**
* 这一步的原因: 当访问HTTPS的网址。您可能已经安装了服务器证书到您的JRE的keystore
* 但是服务器的名称与证书实际域名不相等。这通常发生在你使用的是非标准网上签发的证书。
*
* 解决方法:让JRE相信所有的证书和对系统的域名和证书域名。
*
* 如果少了这一步会报错:java.io.IOException: HTTPS hostname wrong: should be localhost
*/
conn.setHostnameVerifier(new MyX509TrustManager().new TrustAnyHostnameVerifier());
// 设置一些参数
conn.setDoOutput(true);
conn.setDoInput(true);
conn.setUseCaches(false);
conn.setRequestMethod("GET");
// 设置当前实例使用的SSLSoctetFactory
conn.setSSLSocketFactory(ssf);
conn.connect();
InputStream inputStream = conn.getInputStream();
// 3.通过response获取ServletOutputStream对象(out)
out = response.getOutputStream();
int b = 0;
byte[] buffer = new byte[1024];
while ((b = inputStream.read(buffer)) != -1) {
// 4.写到输出流(out)中
out.write(buffer, 0, b);
}
inputStream.close();
out.flush();
out.close();
} catch (FileNotFoundException e) {
return "<p style='color:red;text-align:center'>默认界面未找到</p>";
} catch (IOException e) {
System.out.println("=========="+e.getMessage());
return "<p style='color:red;text-align:center'>界面加载失败</p>";
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (KeyManagementException e) {
e.printStackTrace();
}
return "";
}
运行效果:当调用这个接口时直接返回页面