Проблемы с обработкой HTTP 302 в Java с HttpURLConnection

Я пытаюсь создать код для получения окончательного перенаправленного URL-адреса для необходимых веб-сайтов, но у меня возникают проблемы при обработке http-ответа 302. Похоже, что он не выполняет запрос должным образом, иначе я не понимаю, что не так. Я протестировал принудительное перенаправление с twitter.com и facebook.com и отлично работает (хотя ответы 301), однако при попытке URL-адреса, указанного в «urlin», происходит бесконечный цикл ответов http 302.

Это мой первый пост, поэтому я не могу опубликовать распечатку, потому что она дает более двух ссылок.

Вот код:

/**
 * @param args
 */
public static void main(String[] args) {
    String urlin = "http://feeds.nashuatelegraph.com/~r/news/breaking/~3/jxDTXgSDSGc/jpmorgan-ex-workers-charged-in-london-whale-loss.html";
    String url = new String();
    try{
        System.out.println("URL to redirect: "+urlin);
        int iteration = 0;
        //Preparamos la conexión
        HttpURLConnection con =(HttpURLConnection) new URL(urlin).openConnection();
       // con.setRequestProperty("User-Agent", "Mozilla 5.0");
        con.setReadTimeout(20000);
        con.setInstanceFollowRedirects(false);

        //Definimos un booleano que hara de flag
        boolean redirect = true;
        //Iniciamos la busqueda de URL final
        while(redirect){
            System.out.println("\nIteration number: "+ ++iteration);
            con.connect();
            System.out.println("Connected URL: "+con.getURL().toString());
            int status = con.getResponseCode();
            System.out.println("status: "+status);
            //Tratamos el codigo de respuesta obtenido
            if (status != HttpURLConnection.HTTP_OK) {
                if (status == HttpURLConnection.HTTP_MOVED_TEMP
                        || status == HttpURLConnection.HTTP_MOVED_PERM
                        || status ==    HttpURLConnection.HTTP_SEE_OTHER){
                    redirect = true;
                    //Capturamos la nueva URL
                    String newUrl =     con.getHeaderField("location");
                    //Obtenemos la cookie por si se necesita
                    String cookies =    con.getHeaderField("Set-Cookie");
                    System.out.println("Cookies: "+cookies);
                    //Reabrimos la conexión
                    con = (HttpURLConnection) new URL(newUrl).openConnection();
                    if(cookies!=null){
                     con.setRequestProperty("Cookie", cookies);
                    }
                }
                //Tratamos los errores 400 y 404
                if (status == HttpURLConnection.HTTP_NOT_FOUND ||   status == HttpURLConnection.HTTP_BAD_REQUEST){
                    throw new Exception("Error 400 o 404"); 
                }
            } else {
                redirect = false;
                //Obtenemos la URL final
                url = con.getURL().toString();
            }
        }
    } catch (SocketTimeoutException e) {
        System.out.println("Se ha producido un timeout con URL: "+urlin);
    } catch (UnknownHostException e) {
        System.out.println("Direccion URL desconocida: "+urlin);
        e.printStackTrace();
    } catch (IOException e) {
        System.out.println("Error IOException al procesar el registro URL: "+urlin);
        e.printStackTrace();
    } catch (Exception e) {
        System.out.println("Error al procesar el registro URL: "+urlin);
        e.printStackTrace();
    } 
    if(!url.equals("")) {
        System.out.println("URL final: "+url);
    } else {
        System.out.println("URL final: "+urlin);    
    } 
}

Я буду признателен за все советы, которые вы можете дать.


person user2761746    schedule 09.09.2013    source источник
comment
проверьте этот stackoverflow.com/questions/9143438/302-found-response   -  person upog    schedule 09.09.2013


Ответы (1)


Похоже, что сайт, который вы очищаете, выполняет несколько перенаправлений, используя файлы cookie для определения фактического шага.

В вашем коде вы перехватываете только заголовок Set-Cookie, но отбрасываете ранее установленные файлы cookie (т.е. файлы cookie, установленные ответом n-2).

Кроме того, на сайте есть переключатель http/https, который вам может понадобиться для отправки соответствующего набора файлов cookie.

person Carlo Pellegrini    schedule 09.09.2013
comment
Спасибо за ответ! Я никогда не занимался решением этих проблем с помощью файлов cookie. Есть ли какой-нибудь пример, который я могу найти ?? Я не смог найти много об этом. - person user2761746; 09.09.2013