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

标签 java cookies httpurlconnection http-redirect httpsurlconnection

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

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

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

最佳答案

我遇到麻烦的主要原因是该网站返回了带有适当 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 不断返回。

关于java - 为什么我的 Java HttpsURLConnection 调用不起作用并且 cookie 丢失?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29267850/

相关文章:

java - 如何从 HttpClient 切换到 HttpUrlConnection?

java - 为什么 HttpUrlConnection 需要 getInputStream 来发送请求?

java - 将 uuid 转换为字节,这在使用 UUID.nameUUIDFromBytes(b) 时有效

angular - 等待 Api 的响应 - Angular js 2

java - 实体类的正确设计。需要推荐

iOS Swift WKWebView 维护用户 session Cookie

c# - 在 WebClient 中接受 Cookies?

Java - HttpUrlConnection 每次都返回缓存的响应

java - 限制Java中类的访问

java - 使用 Java 8 的更好方法