如何获取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");
}
答案 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
也许最安全的选择是使用一些流行的网络浏览器使用的用户代理。