java urlconnection get the final redirected URL

后端 未结 7 1785
死守一世寂寞
死守一世寂寞 2020-11-30 13:07

I have a url which redirects to another url.I want to be able to get the final redirected URL.My code:

    public class testURLConnection
    {
    public st         


        
相关标签:
7条回答
  • 2020-11-30 13:19

    Try this, I using recursively to using for many redirection URL.

    public static String getFinalURL(String url) throws IOException {
        HttpURLConnection con = (HttpURLConnection) new URL(url).openConnection();
        con.setInstanceFollowRedirects(false);
        con.connect();
        con.getInputStream();
    
        if (con.getResponseCode() == HttpURLConnection.HTTP_MOVED_PERM || con.getResponseCode() == HttpURLConnection.HTTP_MOVED_TEMP) {
            String redirectUrl = con.getHeaderField("Location");
            return getFinalURL(redirectUrl);
        }
        return url;
    }
    

    and using:

    public static void main(String[] args) throws MalformedURLException, IOException {
        String fetchedUrl = getFinalURL("<your_url_here>");
        System.out.println("FetchedURL is:" + fetchedUrl);
    
    }
    
    0 讨论(0)
  • 2020-11-30 13:19

    This might help

    public static void main(String[] args) throws MalformedURLException,
        IOException {
    
    HttpURLConnection con = (HttpURLConnection) new URL(
            "http://tinyurl.com/KindleWireless").openConnection(proxy);
        System.out.println("orignal url: " + con.getURL());
        con.connect();
        con.setInstanceFollowRedirects(false);
        int responseCode = con.getResponseCode();
        if ((responseCode / 100) == 3) {
            String newLocationHeader = con.getHeaderField("Location");
            responseCode = con.getResponseCode();
            System.out.println("Redirected Location " + newLocationHeader);
            System.out.println(responseCode);
        }
    
    }
    
    0 讨论(0)
  • 2020-11-30 13:21

    @JEETS Your fetchRedirectURL function may not work because there are a variety of HTTP codes for redirects. Change it to a range check and it will work.

    public static String fetchRedirectURL(String url) throws IOException
        {
    HttpURLConnection con =(HttpURLConnection) new URL( url ).openConnection();
    //System.out.println( "orignal url: " + con.getURL() );
    con.setInstanceFollowRedirects(false);
    con.connect();
    
    InputStream is = con.getInputStream();
    if(con.getResponseCode()>=300 && con.getResponseCode() <400)
        return con.getHeaderField("Location");
    else return null;
        }
    
    0 讨论(0)
  • 2020-11-30 13:22
    public static String getFinalRedirectedUrl(String url) {
    
        HttpURLConnection connection;
        String finalUrl = url;
        try {
            do {
                connection = (HttpURLConnection) new URL(finalUrl)
                        .openConnection();
                connection.setInstanceFollowRedirects(false);
                connection.setUseCaches(false);
                connection.setRequestMethod("GET");
                connection.connect();
                int responseCode = connection.getResponseCode();
                if (responseCode >= 300 && responseCode < 400) {
                    String redirectedUrl = connection.getHeaderField("Location");
                    if (null == redirectedUrl)
                        break;
                    finalUrl = redirectedUrl;
                    System.out.println("redirected url: " + finalUrl);
                } else
                    break;
            } while (connection.getResponseCode() != HttpURLConnection.HTTP_OK);
            connection.disconnect();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return finalUrl;
    }
    
    0 讨论(0)
  • 2020-11-30 13:23

    @user719950 On my MAC-OSX - this solves the issue of truncated HTTP URL :

    To your original code , just add this below line : // You have to find through your browser what is the Request Header IE / Chrome is sending. I still dont have the explanation as why this simple setting is causing correct URL :)

    HttpURLConnection con =(HttpURLConnection) new URL
    ( "http://tinyurl.com/KindleWireless" ).openConnection();
     con.setInstanceFollowRedirects(true);
     con.setDoOutput(true);
      System.out.println( "orignal url: " + con.getURL() );     
             **con.setRequestProperty("User-Agent",
        "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_2) 
        AppleWebKit/536.26.17 (KHTML, like Gecko) Version/6.0.2  
       Safari/536.26.17");**                  
    
               con.connect();
        System.out.println( "connected url: " + con.getURL() );
        Thread.currentThread().sleep(2000l);
        InputStream is = con.getInputStream();
        System.out.println( "redirected url: " + con.getURL() );
    
        is.close();
    
    0 讨论(0)
  • 2020-11-30 13:23

    This one goes recursively in case there are multiple redirects:

    protected String getDirectUrl(String link) {
        String resultUrl = link;
        HttpURLConnection connection = null;
        try {
            connection = (HttpURLConnection) new URL(link).openConnection();
            connection.setInstanceFollowRedirects(false);
            connection.connect();
            int responseCode = connection.getResponseCode();
            if (responseCode == HttpURLConnection.HTTP_MOVED_PERM || responseCode == HttpURLConnection.HTTP_MOVED_TEMP) {
                String locationUrl = connection.getHeaderField("Location");
    
                if (locationUrl != null && locationUrl.trim().length() > 0) {
                    IOUtils.close(connection);
                    resultUrl = getDirectUrl(locationUrl);
                }
            }
        } catch (Exception e) {
            log("error getDirectUrl", e);
        } finally {
            IOUtils.close(connection);
        }
        return resultUrl;
    }
    
    0 讨论(0)
提交回复
热议问题