开发者社区 问答 正文

http请求出现异常 求解?

http请求出现以下异常: Caused by: javax.net.ssl.SSLException: closing inbound before receiving peer's close_notify at sun.security.ssl.Alert.createSSLException(Alert.java:133) at sun.security.ssl.Alert.createSSLException(Alert.java:117) at sun.security.ssl.TransportContext.fatal(TransportContext.java:340) at sun.security.ssl.TransportContext.fatal(TransportContext.java:296) at sun.security.ssl.TransportContext.fatal(TransportContext.java:287) at sun.security.ssl.SSLSocketImpl.shutdownInput(SSLSocketImpl.java:737) at sun.security.ssl.SSLSocketImpl.shutdownInput(SSLSocketImpl.java:716) at org.apache.http.impl.BHttpConnectionBase.close(BHttpConnectionBase.java:325) at org.apache.http.impl.conn.LoggingManagedHttpClientConnection.close(LoggingManagedHttpClientConnection.java:81) at org.apache.http.impl.conn.CPoolEntry.closeConnection(CPoolEntry.java:70) at org.apache.http.impl.conn.CPoolProxy.close(CPoolProxy.java:86) at org.apache.http.impl.execchain.ConnectionHolder.releaseConnection(ConnectionHolder.java:103) at org.apache.http.impl.execchain.ConnectionHolder.close(ConnectionHolder.java:156) at org.apache.http.impl.execchain.HttpResponseProxy.close(HttpResponseProxy.java:62) at com.azalea.common.utils.HttpUtils.doPost(HttpUtils.java:188) at com.azalea.common.utils.HttpUtils.postStream(HttpUtils.java:153)

这该死的请求。。。。

展开
收起
magicalman 2021-10-22 11:05:30 814 分享 版权
阿里云 AI 助理回答

遇到这个异常,通常意味着在进行HTTPS通信时,SSL连接在没有正确完成握手关闭流程(即没有收到对方的close_notify消息)就被提前关闭了。这可能是由于网络不稳定、服务器端主动断开连接或客户端、服务端任何一方的SSL实现问题导致的。以下是一些建议来解决这个问题:

  1. 更新依赖库:确保你使用的HTTP客户端库(如Apache HttpClient)和JDK是最新的版本。有时候,这些问题是由于旧版本库中的bug引起的,新版本可能已经修复了这些问题。

  2. 调整超时设置:增加连接和读取超时时间,以应对网络不稳定的情况。在Apache HttpClient中,你可以通过RequestConfig来设置这些值。

    RequestConfig config = RequestConfig.custom()
       .setConnectTimeout(5000) // 连接超时时间,单位毫秒
       .setSocketTimeout(30000) // 读取超时时间,单位毫秒
       .build();
    
    CloseableHttpClient httpClient = HttpClients.custom()
       .setDefaultRequestConfig(config)
       .build();
    
  3. 忽略SSL错误测试:仅在调试阶段使用,不建议生产环境忽略SSL验证,因为这会降低安全性。可以通过自定义SSLContextHostnameVerifier来忽略SSL证书验证错误。

    TrustManager[] trustAllCerts = new TrustManager[] {
       new X509TrustManager() {
           public java.security.cert.X509Certificate[] getAcceptedIssuers() {
               return null;
           }
           public void checkClientTrusted(X509Certificate[] certs, String authType) {}
           public void checkServerTrusted(X509Certificate[] certs, String authType) {}
       }
    };
    
    SSLContext sslContext = SSLContext.getInstance("SSL");
    sslContext.init(null, trustAllCerts, new java.security.SecureRandom());
    
    HttpClientBuilder builder = HttpClients.custom()
       .setSSLContext(sslContext)
       .setSSLHostnameVerifier(NoopHostnameVerifier.INSTANCE);
    
  4. 检查服务器配置:如果问题持续存在,可能需要与服务器管理员沟通,查看服务器日志,确认是否有服务器端主动断开连接的行为或者SSL配置问题。

  5. 使用网络抓包工具:利用Wireshark或Fiddler等工具抓取请求的网络包,分析SSL握手过程,看是否能发现具体哪里出了问题。

  6. 考虑重试逻辑:在客户端代码中加入合理的重试机制,对于一些临时性的网络或服务器问题,重试可能会解决问题。

请根据具体情况尝试上述建议,并优先考虑那些不会牺牲安全性的解决方案。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答