java JDK1.7的HTTPConnection请求Connection reset问题解决
这几天有个接口,发现有个奇怪的问题,之前好的突然间出现httpconnection的链接请求错误
错误代码如下:
Caused by: java.net.SocketException: Connection reset at java.net.SocketInputStream.read(SocketInputStream.java:189) at java.net.SocketInputStream.read(SocketInputStream.java:121) at sun.security.ssl.InputRecord.readFully(InputRecord.java:312) at sun.security.ssl.InputRecord.read(InputRecord.java:350) at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:893)
刚开始一点头绪都没有,后来慢慢研究发现,原来是客户更新了https证书,该证书不在支持TLSV1.0了导致的。而我们服务端的JDK版本比较久,是JDK1.7的,1.7默认使用的TLS版本是1.0,所以才会有这个问题
,需要在我们HTTPConnection中增加对默认tls的设置,才可以正常访问接口
加入下面代码:
/** * 证书信任 */ private static void trustAllHttpsCertificates() { try { 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("TLSv1.2");//默认jdk1.7是使用tlsv1.0协议,这里采用1.2 sc.init(null, trustAllCerts, null); javax.net.ssl.HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory()); } catch(Exception e) { e.printStackTrace(); } } static class miTM implements javax.net.ssl.TrustManager, javax.net.ssl.X509TrustManager { 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; } public void checkServerTrusted(java.security.cert.X509Certificate[] certs, String authType) throws java.security.cert.CertificateException { return; } public void checkClientTrusted(java.security.cert.X509Certificate[] certs, String authType) throws java.security.cert.CertificateException { return; } }
看到tlsv1.2的地方,改一下。然后在你原来connection链接请求地方调用上面代码方法
public static String getHttpContent(String url, String charSet) { //该部分必须在获取connection前调用 HostnameVerifier hv = new HostnameVerifier() { public boolean verify(String urlHostName, SSLSession session) { System.out.println("Warning: URL Host: " + urlHostName + " vs. " + session.getPeerHost()); return true; } }; trustAllHttpsCertificates(); //////////在您connection之前调用一下就可以了 HttpURLConnection connection = null; String content = ""; try { URL address_url = new URL(url); connection = (HttpURLConnection) address_url.openConnection(); connection.setRequestProperty("Content-type", "text/html"); connection.setRequestProperty("Accept-Charset", charSet); connection.setRequestProperty("contentType", charSet); connection.setDoInput(true); connection.setDoOutput(true); // connection.setRequestMethod("GET"); //设置访问超时时间及读取网页流的超市时间,毫秒值 System.setProperty("sun.net.client.defaultConnectTimeout","20000"); System.setProperty("sun.net.client.defaultReadTimeout", "20000");
希望对后来的人有帮助就好。特此留帖!
相关推荐
java jdk 1.7官网免安装版本,解压就可以直接使用,不用再官网登录账号就可以直接下载,省去很多麻烦,不用各种等待,直接使用csdn平台就可以直接下载。
linux java jdk1.7 tar.gz linux java jdk1.7 tar.gzlinux java jdk1.7 tar.gzlinux java jdk1.7 tar.gz
jdk1.7_linux Linux版零积分jdk1.7_linux Linux版零积分免费下载jdk1.7_linux Linux版零积分免费下载jdk1.7_linux Linux版零积分免费下载jdk1.7_linux Linux版零积分免费下载jdk1.7_linux Linux版零积分免费下载jdk...
java jdk1.7源码包,用于centos7使用jdk1.7编译openjdk1.8的 1.7版本
java 运行所需的环境jdk1.7java 运行所需的环境jdk1.7java 运行所需的环境jdk1.7
java JDK1.7,版本下载,和配置,注释事项,如果有需要1.5和1.6的同志我也发布过,上传资源上限不能一起发
此版本为java1.7的解压缩版本,满足广大程序员对于JDK1.7的需求
jdk1.7,32位免安装版,其他不知道说什么了,就这样编吧
java jdk1.7.zip 64位,喜欢就拿去吧!!!!!!!!!
jdk 1.7 64位jdk 1.7 64位jdk 1.7 64位jdk 1.7 64位jdk 1.7 64位jdk 1.7 6
jdk1.7版本免安装
java jdk1.7和1.8 Windows安装包
Java开发必备利器,JDK1.7中文帮助文档,是你不二的选择
javajdk1.7。这是javajdk1.7window安装版本。方便使用。
JDK1.7 64位,官方版本方便大家下载,不需要去官网下载
JDK1.7 Ubuntu16.04亲测可用,满足官网关闭1.7下载链接、apt-get无法下载用户
java_JDK1.7.zipjava_JDK1.7.zipjava_JDK1.7.zipjava_JDK1.7.zip
java JDK1.7 window版本安装包
jdk1.7 32位 官方正式版 jdk-7u79-windows-i586 JDK详细介绍 JDK(Java Development Kit) 是 Java 语言的软件开发工具包(SDK)。 SE(J2SE),standard edition,标准版,是我们通常用的一个版本,从JDK 5.0开始,改名...