为什么我的 Java HttpsURLConnection 调用不起作用并且 cookie 丢失?

Why are my Java HttpsURLConnection calls not working and cookies being lost?

我遇到了一个令人沮丧的情况,在网站切换到 https 后,我编写的一些 java 代码自动执行网站上的某些操作停止工作。我无法再正确登录。相反,我最终会在登录失败时得到 200 个结果。

我不明白为什么它似乎忽略了我发送的登录数据,并且没有返回 cookie 以在后续调用中识别我自己。

我在这里回答我自己的问题,因为我终于弄清楚发生了什么,并希望它可以帮助其他人(以及我未来的自己)。

我遇到麻烦的主要原因是网站返回了带有适当 cookie 的 302 结果,但我从来没有机会解释它。

HttpURLConnection 的默认行为是为我遵循重定向。如果它还保留了从第一个请求返回的 cookie,那就太棒了,但事实并非如此。这导致服务器接收到正确站点的重定向,但丢失了显示我的登录正确的 cookie。

要解决这个问题,只需要在我的程序早期调用:

HttpURLConnection.setFollowRedirects(false);

让我的代码看到 302,然后可以收集 cookie 值并向新的 Location 重新提交请求。我不知道这是不是重定向后忽略了 Set-Cookie header 值的错误,但它是否应该有,这确实让我困惑了一段时间。

另一个问题是我使用的网站有时会发送一个 Location 相对值而不是绝对值,所以我不得不用这样的代码来处理它:

if (!location.startsWith("http")) {
    String newLocation = url.getProtocol() + "://" + url.getHost();
    if (url.getPort() > 0) {
        newLocation += ":" + url.getPort();
    }
    if (location.startsWith("/")) {
        newLocation += location; 
    }
    else {
        if (!location.startsWith("/")) {
            location = "/" + location;
        }
        newLocation += url.getPath() + location;
    }
    location = newLocation;
}
url = new URL(location);

这将在不断尝试新的 url 值而 302 不断返回的循环中完成。