什么时候URL重定向发生?

时间:2014-11-04 12:45:01

标签: java redirect httpurlconnection

我有一个重定向到另一个的网址,重定向到另一个网址,我试图获取结束域名。我认为重定向会在连接时发生,但运行此代码会告诉我:

public static void main(String[] args)
    {
        System.out.println(resolveEndDomain("http://goo.gl/ELHEjl"));
    }

    private static String resolveEndDomain(String deepLink)
    {
        HttpURLConnection httpConnection = null;
        try
        {
            httpConnection = (HttpURLConnection) new URL(deepLink).openConnection();
            //httpConnection.getResponseCode();  
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
        return httpConnection.getURL().getHost();
    }

所以,如果我运行它,它只会给我goo.gl。但是,如果我取消注释该行以获取响应代码,它会从结束域获取并打印www.thomann.de。如果我使用getHeaderFields()getContent()或类似内容,则相同,但connect()似乎没有帮助。我对这些回复并不感兴趣所以,我该怎样才能解决重定向?连接何时有效发生?

1 个答案:

答案 0 :(得分:0)

至于您的问题,当连接的服务器回复301或302 HTTP状态代码时,会发生重定向。请注意,状态代码是服务器答案的一部分,因此您必须实际从中请求资源(通常使用connect())。

正如您已经发现的那样,HttpURLConnection通常会处理检查重定向状态代码的部分,并将您重定向到作为重定向响应的一部分提供的URL(最多重定向,我不确定限定的地方)。

您可以将followsRedirects设置为false并自行解释HTTP标头,以查找是否要重定向,但直到获得2X状态代码(或{ {1}} - 找不到,禁止 - 或4XX - 服务器错误 - )您将不确定您被重定向到的URL是否是最后一个。

例如,您可以连接到5XX并发现它会将您重定向到http://goo.gl/ELHEjl。但是,除非您连接到该URL并获得非3XX状态代码,否则您无法确定连接到http://www.bit.ly/s34314313是最终资源位置还是只会重定向您。