【问题标题】:Cant establish Jsoup connection when passing URL String in a certain way以某种方式传递URL字符串时无法建立Jsoup连接
【发布时间】:2021-01-11 13:57:55
【问题描述】:

我有一个非常奇怪的问题。

我正在运行一个 spring 应用程序,我基本上只是生成一些线程,然后尝试建立与网站的连接以提取这些线程中响应的状态代码。没什么特别的,但我遇到了一个让我很困惑的问题。

我有以下代码

@Override
    public void run() {

        Document document;
        Connection.Response response;
        String link = "https://lu.vpbank.com/htm/752/de_LU/Stellenangebote.htm";
        System.out.println(link);
        System.out.println(this.site.getLink());

        //Is working fine
        try {
            response = Jsoup.connect(link).followRedirects(false).ignoreHttpErrors(true).execute();
            System.out.println(response.statusCode());
        } catch (IOException e) {
            e.printStackTrace();
        }

        //Is not working
        try {
            response = Jsoup.connect(this.site.getLink()).followRedirects(false).ignoreHttpErrors(true).execute();
            System.out.println(response.statusCode());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

事情是第一次尝试创建连接很好,因为我在方法中声明了字符串的内容。

在第二次尝试中,我从之前创建的对象中获取 URL 字符串,并从数据库中获取 url。这会引发错误.....

控制台输出为:

https://lu.vpbank.com/htm/752/de_LU/Stellenangebote.htm
404
https://www.vpbank.lu/htm/752/de_LU/Stellenangebote.htm
javax.net.ssl.SSLException: Connection reset
    at java.base/sun.security.ssl.Alert.createSSLException(Alert.java:127)
    at java.base/sun.security.ssl.TransportContext.fatal(TransportContext.java:369)
    at java.base/sun.security.ssl.TransportContext.fatal(TransportContext.java:312)
    at java.base/sun.security.ssl.TransportContext.fatal(TransportContext.java:307)
    at java.base/sun.security.ssl.SSLSocketImpl.handleException(SSLSocketImpl.java:1680)
    at java.base/sun.security.ssl.SSLSocketImpl$AppInputStream.read(SSLSocketImpl.java:1054)
    at java.base/java.io.BufferedInputStream.fill(BufferedInputStream.java:244)
    at java.base/java.io.BufferedInputStream.read1(BufferedInputStream.java:284)
    at java.base/java.io.BufferedInputStream.read(BufferedInputStream.java:343)
    at java.base/sun.net.www.http.HttpClient.parseHTTPHeader(HttpClient.java:754)
    at java.base/sun.net.www.http.HttpClient.parseHTTP(HttpClient.java:689)
    at java.base/sun.net.www.http.HttpClient.parseHTTP(HttpClient.java:713)
    at java.base/sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1623)
    at java.base/sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1528)
    at java.base/java.net.HttpURLConnection.getResponseCode(HttpURLConnection.java:527)
    at java.base/sun.net.www.protocol.https.HttpsURLConnectionImpl.getResponseCode(HttpsURLConnectionImpl.java:308)
    at org.jsoup.helper.HttpConnection$Response.execute(HttpConnection.java:736)
    at org.jsoup.helper.HttpConnection$Response.execute(HttpConnection.java:707)
    at org.jsoup.helper.HttpConnection.execute(HttpConnection.java:297)
    at net.candidatis.tierone.crawls.careersite.CrawlableCareerBasic.run(CrawlableCareerBasic.java:48)
    at net.candidatis.tierone.controllers.TestController.testCrawl(TestController.java:32)
    at net.candidatis.tierone.TieroneApplication.run(TieroneApplication.java:36)
    at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:804)
    at org.springframework.boot.SpringApplication.callRunners(SpringApplication.java:788)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:333)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1309)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1298)
    at net.candidatis.tierone.TieroneApplication.main(TieroneApplication.java:27)
    Suppressed: java.net.SocketException: Broken pipe
        at java.base/sun.nio.ch.NioSocketImpl.implWrite(NioSocketImpl.java:420)
        at java.base/sun.nio.ch.NioSocketImpl.write(NioSocketImpl.java:440)
        at java.base/sun.nio.ch.NioSocketImpl$2.write(NioSocketImpl.java:826)
        at java.base/java.net.Socket$SocketOutputStream.write(Socket.java:1051)
        at java.base/sun.security.ssl.SSLSocketOutputRecord.encodeAlert(SSLSocketOutputRecord.java:82)
        at java.base/sun.security.ssl.TransportContext.fatal(TransportContext.java:400)
        ... 26 more
Caused by: java.net.SocketException: Connection reset
    at java.base/sun.nio.ch.NioSocketImpl.implRead(NioSocketImpl.java:323)
    at java.base/sun.nio.ch.NioSocketImpl.read(NioSocketImpl.java:350)
    at java.base/sun.nio.ch.NioSocketImpl$1.read(NioSocketImpl.java:803)
    at java.base/java.net.Socket$SocketInputStream.read(Socket.java:981)
    at java.base/sun.security.ssl.SSLSocketInputRecord.read(SSLSocketInputRecord.java:478)
    at java.base/sun.security.ssl.SSLSocketInputRecord.readHeader(SSLSocketInputRecord.java:472)
    at java.base/sun.security.ssl.SSLSocketInputRecord.bytesInCompletePacket(SSLSocketInputRecord.java:70)
    at java.base/sun.security.ssl.SSLSocketImpl.readApplicationRecord(SSLSocketImpl.java:1434)
    at java.base/sun.security.ssl.SSLSocketImpl$AppInputStream.read(SSLSocketImpl.java:1038)
    ... 22 more

正如我们在控制台输出中看到的,url 是相同的。

站点只是我在启动线程之前创建的一个简单对象。

import lombok.Data;

@Data
public class Site {
    private final String link;
}

有人知道这个错误的原因可能是什么吗?

【问题讨论】:

    标签: java multithreading sockets ssl jsoup


    【解决方案1】:

    正如我们在控制台输出中看到的,URL 是相同的。

    但是,它们并不相同。它们有不同的主机名,这就是你得到不同行为的原因:

    https://lu.vpbank.com/htm/752/de_LU/Stellenangebote.htm https://www.vpbank.lu/htm/752/de_LU/Stellenangebote.htm

    在浏览器中,第二个重定向到第一个。我猜它有不同的 TLS 设置,或者可能以不同的方式验证连接(有一些必需的标头?),这就是你收到连接重置错误的原因。但是,这是一个不同的问题。

    (顺便说一句,感谢您提供足够的详细信息,包括打印您尝试访问的实际 URL - 让您以全新的眼光轻松提供帮助!)

    【讨论】:

    • 哇,我怎么会错过。确实是一双新鲜的眼睛……我的视野已经是一条隧道。我将尝试将标题与浏览器中的标题完全匹配。不同的 TLS 设置嗯...我会尝试用这些信息来解决它。非常感谢!
    • 所以这不是因为任何标题。有没有办法告诉 Jsoup 使用类似于我的浏览器的 TLS 设置?我不确定如何解决此错误。我基本上希望 Jsoup 获得重定向的响应,这样我就可以获得状态码 404。(这个问题发生在许多网站上)
    • 我调试了一下——至少对我来说,SSL 连接可以正确握手。但是,当发出 HTTP/1.1 请求时,服务器要么关闭连接,要么无限期保持打开状态(超时)。它似乎只支持 HTTP/2。这似乎有点粗鲁!现在你需要使用不同的客户端,比如 OkHttp。 (在 Android 上,jsoup 通过 Ok Http 作为基础实现,但在桌面上它仍将使用 HttpURLConnection。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-02
    • 2021-12-28
    • 1970-01-01
    • 1970-01-01
    • 2021-05-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多