有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Java如何找到url的重定向url?

我通过java访问网页,如下所示:

URLConnection con = url.openConnection();

但在某些情况下,url会重定向到另一个url。所以我想知道前一个url重定向到的url

下面是作为响应得到的标题字段:

null-->[HTTP/1.1 200 OK]
Cache-control-->[public,max-age=3600]
last-modified-->[Sat, 17 Apr 2010 13:45:35 GMT]
Transfer-Encoding-->[chunked]
Date-->[Sat, 17 Apr 2010 13:45:35 GMT]
Vary-->[Accept-Encoding]
Expires-->[Sat, 17 Apr 2010 14:45:35 GMT]
Set-Cookie-->[cl_def_hp=copenhagen; domain=.craigslist.org; path=/; expires=Sun, 17     Apr 2011 13:45:35 GMT, cl_def_lang=en; domain=.craigslist.org; path=/; expires=Sun, 17 Apr 2011 13:45:35 GMT]
Connection-->[close]
Content-Type-->[text/html; charset=iso-8859-1;]
Server-->[Apache]

因此,目前,我正在从Set-Cookie头字段的值构造重定向url。在上述情况下,重定向的url是copenhagen.craigslist.org

是否有任何标准方法可以确定特定url要重定向的url

我知道,当一个url重定向到其他url时,服务器发送一个包含Location头字段的中间响应,该字段告诉重定向的url,但我没有通过url.openConnection();方法接收到该中间响应


共 (6) 个答案

  1. # 1 楼答案

    看看HttpURLConnectionAPI documentation,尤其是setInstanceFollowRedirects()

  2. # 2 楼答案

    您需要将URLConnection强制转换为HttpURLConnection,并通过将^{}设置为false来指示它执行重定向。您还可以通过^{}全局设置它

    你只需要自己处理重定向。通过^{}检查响应代码,通过^{}获取Location头,然后对其发出新的HTTP请求

  3. # 3 楼答案

    在调用getInputStream()之后,只需在URLConnection实例上调用getUrl():

    URLConnection con = new URL( url ).openConnection();
    System.out.println( "orignal url: " + con.getURL() );
    con.connect();
    System.out.println( "connected url: " + con.getURL() );
    InputStream is = con.getInputStream();
    System.out.println( "redirected url: " + con.getURL() );
    is.close();
    

    如果您需要知道重定向是否在实际获取其内容之前发生,以下是示例代码:

    HttpURLConnection con = (HttpURLConnection)(new URL( url ).openConnection());
    con.setInstanceFollowRedirects( false );
    con.connect();
    int responseCode = con.getResponseCode();
    System.out.println( responseCode );
    String location = con.getHeaderField( "Location" );
    System.out.println( location );
    
  4. # 4 楼答案

    @balusC我照你写的做了。在我的例子中,我添加了cookie信息,以便能够重用会话

       // get the cookie if need
        String cookies = conn.getHeaderField("Set-Cookie");
    
        // open the new connnection again
        conn = (HttpURLConnection) new URL(newUrl).openConnection();
        conn.setRequestProperty("Cookie", cookies);
    
  5. # 5 楼答案

    实际上,我建议使用一个可靠的开源库作为http客户端。如果你看看ASF的http client,你会发现生活会轻松得多。它是一个易于使用、可扩展且健壮的http客户端

  6. # 6 楼答案

    public static URL getFinalURL(URL url) {
        try {
            HttpURLConnection con = (HttpURLConnection) url.openConnection();
            con.setInstanceFollowRedirects(false);
            con.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36");
            con.addRequestProperty("Accept-Language", "en-US,en;q=0.8");
            con.addRequestProperty("Referer", "https://www.google.com/");
            con.connect();
            //con.getInputStream();
            int resCode = con.getResponseCode();
            if (resCode == HttpURLConnection.HTTP_SEE_OTHER
                    || resCode == HttpURLConnection.HTTP_MOVED_PERM
                    || resCode == HttpURLConnection.HTTP_MOVED_TEMP) {
                String Location = con.getHeaderField("Location");
                if (Location.startsWith("/")) {
                    Location = url.getProtocol() + "://" + url.getHost() + Location;
                }
                return getFinalURL(new URL(Location));
            }
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
        return url;
    }
    

    要自己获取“用户代理””和“引用者”,只需进入其中一个已安装浏览器的开发者模式(例如,在Google Chrome上按F12)。然后转到“网络”选项卡,然后单击其中一个请求。你应该看看它的细节。只需按“标题”子选项卡(下图) request details