首页 > 解决方案 > Java 11 JSOUP SSLHandshakeException

问题描述

这是我在这里的第一篇文章,所以如果我做错了什么,请随时告诉我。

我编写了几行代码Java 11以从带有JSOUP (1.14.2). 由于网络商店是多页数据,因此我使用循环来获取我想要的所有 url。

这是我正在做的一个简化示例:

for (int i = 1; i < 36; i++) {
    String url = ("https://www.play-in.com/rachat/hotlist/magic?p=" + i);

    try {
        doc = Jsoup.connect(url).get();
    } catch (Exception e) {
        logger.info("Impossible de récuppérer les éléments de la page " + i + " : " + e);
    }

    //  here i'm parsing the HTML to return an array of object
}

当我运行程序时,我得到:

[main] INFO  service.MagicBazarReader  -  Failed to get data from page 2 : javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure  
[main] INFO  service.MagicBazarReader  -  Failed to get data from page 3 : javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure  
[main] INFO  service.MagicBazarReader  -  Failed to get data from page 4 : javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure  
[main] INFO  service.MagicBazarReader  -  Failed to get data from page 5 : javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure  
[main] INFO  service.MagicBazarReader  -  Failed to get data from page 6 : javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure  
[...]
[main] INFO  ISmellProfits  - Number of result after HTML parsing : 24

等等。所以第一个get()总是成功的,我可以操纵结果,但是在调用 multipe 时似乎有问题Jsoup.connect()

由于我正在调用一个HTTPSurl,我的第一个想法是证书问题,我尝试了这个解决方案How to connect via HTTPS using Jsoup? 但它没有帮助。如果certificate真的需要 a 我不应该能够在第一次访问该 url,但我在这里可能错了,因为我对这个域知之甚少。

第二个想法是使用并行流

List <String> links = new ArrayList<>();
for (int i = 1; i < 36; i++) {
    String url = ("https://www.play-in.com/rachat/hotlist/magic?p=" + i);
    links.add(url);
}

links.parallelStream().forEach(link - > {
    Document doc = new Document("");
    try {
        doc = Jsoup.connect(link).get();

        // here i'm parsing the HTML to return an array of object 
    } catch (Exception e) {
        logger.info("Impossible de récuppérer les éléments de la page " + link.substring(link.length() - 2) + " : " + e);
    }
});

我有更好的结果,但仍然不完美:

[ForkJoinPool.commonPool-worker-17] INFO  service.MagicBazarReader  - Failed to get data from page 12 : javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure  
[ForkJoinPool.commonPool-worker-23] INFO  service.MagicBazarReader  -  Failed to get data from page 30 : javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure  
[ForkJoinPool.commonPool-worker-9] INFO  service.MagicBazarReader  -  Failed to get data from page 5 : javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure  
[ForkJoinPool.commonPool-worker-27] INFO  service.MagicBazarReader  -  Failed to get data from page 35 : javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure  
[main] INFO  service.MagicBazarReader  -  Failed to get data from page 22 : javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure  
[ForkJoinPool.commonPool-worker-3] INFO  service.MagicBazarReader  -  Failed to get data from page 1 : javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure  
[ForkJoinPool.commonPool-worker-7] INFO  service.MagicBazarReader  -  Failed to get data from page 2 : javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure  
[ForkJoinPool.commonPool-worker-21] INFO  service.MagicBazarReader  -  Failed to get data from page 17 : javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure  
[ForkJoinPool.commonPool-worker-5] INFO  service.MagicBazarReader  -  Failed to get data from page 31 : javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure  
[...]
[main] INFO  ISmellProfits  - Number of result after HTML parsing : 286

所以我在HTML解析后得到了更多的结果,但它们并不一致,因为我每次运行都有不同的数字而且我仍然得到SSLHandshakeException.

我不知道了,所以我问是否有人知道是什么导致异常被抛出。
我是使用JSOUP的新手,所以我仍然不太了解。我认为这可能是JSOUP一次只能有连接,循环在第一个关闭之前调用新的。

谢谢阅读。

标签: javajsoup

解决方案


[解决]

因此,问题似乎在于 JDK11 以及 JDK 中默认启用的协议中存在 TLSv1.3。我尝试使用 JDK 16 并且我不再有问题了。指向更深入解释的帖子的链接:Java 11 and 12 SSL sockets fail on a handshake_failure error with TLSv1.3 enabled


推荐阅读