【问题标题】:Why are my Java HttpsURLConnection calls not working and cookies being lost?为什么我的 Java HttpsURLConnection 调用不起作用并且 cookie 丢失?
【发布时间】:2015-05-29 20:14:03
【问题描述】:
我有一个令人沮丧的情况,我编写的一些用于在网站上自动执行某些操作的 java 代码在网站切换到 https 后停止工作。我无法再正确登录。相反,我最终会在登录失败时得到 200 的结果。
我无法弄清楚为什么它似乎忽略了我发送的登录数据,并且没有将 cookie 返还给我以在后续调用中识别我自己。
我在这里回答我自己的问题,因为我终于弄清楚发生了什么,并希望它可以帮助其他人(以及我未来的自己)。
【问题讨论】:
标签:
java
cookies
httpurlconnection
http-redirect
httpsurlconnection
【解决方案1】:
我遇到麻烦的主要原因是网站返回了带有适当 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 不断返回。