我遇到了一个令人沮丧的情况,我在网站切换到https后,为自动执行某些操作而编写的一些java代码停止工作。我无法再正常登录了。相反,我最终会因登录失败而获得200结果。
我无法弄清楚为什么它似乎忽略了我发送的登录数据,并且没有给我回复cookie以便在后续通话中识别自己。
我在这里回答了我自己的问题,因为我终于找到了正在发生的事情并希望它可以帮助其他人(以及我未来的自我)。
答案 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继续回来。