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

时间:2015-03-25 22:37:27

标签: java cookies httpurlconnection http-redirect httpsurlconnection

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

我无法弄清楚为什么它似乎忽略了我发送的登录数据,并且没有给我回复cookie以便在后续通话中识别自己。

我在这里回答了我自己的问题,因为我终于找到了正在发生的事情并希望它可以帮助其他人(以及我未来的自我)。

1 个答案:

答案 0 :(得分:2)

我遇到麻烦的主要原因是该网站使用适当的Cookie返回了302结果,但我没有机会解释它。

HttpURLConnection的默认行为是跟随重定向。如果它们在第一次请求回来时保留了cookie,那本来就是花花公子,但事实并非如此。这导致服务器收到重定向到正确的站点,但丢失其cookie显示我的登录是好的。

要解决此问题,我需要在程序的早期进行此调用:

HttpURLConnection.setFollowRedirects(false);

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

另一个问题是我使用的网站有时会发送一个相对而非绝对的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继续回来。