【问题标题】: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 不断返回。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-10-07
      • 2011-12-19
      • 2015-08-14
      • 2012-06-25
      • 2016-01-11
      • 1970-01-01
      相关资源
      最近更新 更多