获取特定URL的重定向URL(使用Java)

时间:2013-12-26 11:07:06

标签: java http-redirect url-redirection

如何获取http://at.atwola.com/?adlink/5113/1649059/0/2018/AdId=4041444;BnId=872;itime=15692006;impref=13880156912668385284的重定向网址;在Java?

我的代码(如下所示)是根据堆栈溢出的类似问题的答案构建的(特别是https://stackoverflow.com/a/5270162/1382251)。

但它只会产生原始网址。我怀疑还有其他类似的情况,所以我想具体解决这个问题并一般使用解决方案。

    String ref = "http://at.atwola.com/?adlink/5113/1649059/0/2018/AdId=4041444;BnId=872;itime=15692006;impref=13880156912668385284;";
    try
    {
        URLConnection con1 = new URL(ref).openConnection();
        con1.connect();
        InputStream is = con1.getInputStream();
        URL url = con1.getURL();
        is.close();
        String finalPage = url.toString();
        if (finalPage.equals(ref))
        {
            HttpURLConnection con2 = (HttpURLConnection)con1;
            con2.setInstanceFollowRedirects(false);
            con2.connect();
            if (con2.getResponseCode()/100 == 3)
                finalPage = con2.getHeaderField("Location");
        }
        System.out.println(finalPage);
    }
    catch (Exception error)
    {
        System.out.println("error");
    }

1 个答案:

答案 0 :(得分:1)

我使用telnet,wget和curl对你的URL进行了一些操作,我注意到在某些情况下服务器会返回响应200 OK,有时会返回302 Moved Temporarily。主要区别似乎是请求User-agent标头。如果您在con1.connect()

之前添加以下内容,则代码可以正常运行
con1.setRequestProperty("User-Agent","");

也就是说,使用空的User-Agent(或者如果根本不存在标头),服务器会发出重定向。使用Java User-Agent(在我的情况下为User-Agent: Java/1.7.0_45)并使用默认curl User-Agent(User-Agent: curl/7.32.0),服务器响应200 OK。

在某些情况下,您可能还需要设置:

System.setProperty("http.agent", "");

请参阅Setting user agent of a java URLConnection

运行该网站的服务器是Adtech广告服务器,显然它正在进行user agent sniffing。有一个long history of user agent sniffing。因此,最安全的做法是将用户代理设置为Mozilla:

con1.setRequestProperty("User-Agent","Mozilla"); //works with your code for your URL

也许最安全的选择是使用一些流行的网络浏览器使用的用户代理。