Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Работа с сетью > httpClient и редирект, как боротся ?


Автор: googol 2.2.2009, 16:37
Использую httpclient для скачки обычного HTML 
но возникает проблема сайт вызывает редирект 

установка переменной ALLOW_CIRCULAR_REDIRECTS не приводи к положительному результату 
возникает исключение CircularRedirectException Maximum redirects (100) exceeded 

я скачиваю первую страницу http://betbase.info/ 

но по ссылке которая на этой странице 
http://betbase.info/?setupoption=lang&newvalue=eng я уже перейти не могу 

Как с этим боротся ?
Код

public static void main(String[] args) throws Exception { 
        String strURL = "http://www.betbase.info/"; 
        System.out.println("Target URL: " + strURL); 
        HttpState initialState = new HttpState(); 
        HttpClient httpclient = new HttpClient(); 
        httpclient.getHttpConnectionManager(). 
            getParams().setConnectionTimeout(60000); 
        httpclient.setState(initialState); 
        httpclient.getParams().setCookiePolicy(CookiePolicy.BROWSER_COMPATIBILITY); 
        httpclient.getParams().setBooleanParameter(HttpClientParams.ALLOW_CIRCULAR_REDIRECTS,true); 
        GetMethod httpget = new GetMethod(strURL); 
        int result = httpclient.executeMethod(httpget); 
        Cookie[] cookies = httpclient.getState().getCookies(); 
        System.out.println("Response status code: " + result); 
        System.out.println("Present cookies: "); 
        for (int i = 0; i < cookies.length; i++) { 
            System.out.println(" - " + cookies[i].toExternalForm()); 
        } 
        System.out.println(httpget.getResponseBodyAsString()); 
        strURL = "http://www.betbase.info/?setupoption=lang&newvalue=eng"; 
        System.out.println("Target URL: " + strURL); 


        initialState = new HttpState(); 
        initialState.addCookies(cookies); 
        httpclient.getHttpConnectionManager(). 
        getParams().setConnectionTimeout(60000); 
        httpclient.setState(initialState); 
        httpclient.getParams().setBooleanParameter(HttpClientParams.ALLOW_CIRCULAR_REDIRECTS,true); 
        httpclient.getParams().setParameter("Referer","http://www.betbase.info/"); 
        httpclient.getParams().setCookiePolicy(CookiePolicy.BROWSER_COMPATIBILITY); 

        httpget = new GetMethod(strURL); 

         result = httpclient.executeMethod(httpget); 

        System.out.println("Response status code: " + result); 

        cookies = httpclient.getState().getCookies(); 

        System.out.println("Present cookies: "); 
        for (int i = 0; i < cookies.length; i++) { 

            System.out.println(" - " + cookies[i].getValue()); 
        } 
        System.out.println(httpget.getResponseBodyAsString()); 
        httpget.releaseConnection(); 
    }


Автор: Platon 2.2.2009, 17:02
А зачем вы, позвольте узнать, initialState определяете 2 раза. 
Это не ваш код? Попробуйте для начала посмотреть FAQ про http://forum.vingrad.ru/faq/topic-216595.html

Автор: googol 2.2.2009, 17:48
да код мой 





Суть в том что второй вызов  executeMethod
не проходит
вываливается ошибка 
org.apache.commons.httpclient.CircularRedirectException: Circular redirect to 'http://www.betbase.info:80/'

Автор: Platon 2.2.2009, 18:43
Увы, повторить ошибку не удалось. Всё проходит без проблем...

Автор: googol 2.2.2009, 19:23
втом то и дело что  раз 5 запусти а потом уже не будет.


или на прямую скачать урл http://www.betbase.info/?setupoption=lang&newvalue=eng
не получается

Я уже запустил в броузере трассировку
вот результат


16:01:47.372[113мс][всего 113мс] Статус: 302[Found]
GET http://betbase.info/?setupoption=lang&newvalue=eng Флаги загрузки[LOAD_DOCUMENT_URI  LOAD_INITIAL_DOCUMENT_URI  ] Размер содержимого[0] Тип Mime[text/html]
   Заголовки запроса:
      Host[betbase.info]
      User-Agent[Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.0.5) Gecko/2008120122 Firefox/3.0.5]
      Accept[text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8]
      Accept-Language[ru,en-us;q=0.7,en;q=0.3]
      Accept-Encoding[gzip,deflate]
      Accept-Charset[windows-1251,utf-8;q=0.7,*;q=0.7]
      Keep-Alive[300]
      Connection[keep-alive]
      Referer[http://betbase.info/]
   Заголовки ответа:
      Date[Mon, 02 Feb 2009 14:01:50 GMT]
      Server[Apache]
      X-Powered-By[PHP/4.4.8]
      Set-Cookie[options=%26xupdate%3D528%26xtime%3D1233583310%26lang%3Deng%26userid%3Dy8e61233583310; expires=Tue, 02 Feb 2010 14:01:50 GMT; path=/; domain=betbase.info]
      Location[http://betbase.info/?setupoption=cookies&xupdate=528&xtime=1233583310&lang=eng&userid=y8e61233583310&lastURL=]
      Keep-Alive[timeout=15, max=100]
      Connection[Keep-Alive]
      Content-Type[text/html]
      Content-Length[0]


16:01:47.488[61мс][всего 61мс] Статус: 302[Found]
GET http://betbase.info/?setupoption=cookies&xupdate=528&xtime=1233583310&lang=eng&userid=y8e61233583310&lastURL= Флаги загрузки[LOAD_DOCUMENT_URI  LOAD_REPLACE  LOAD_INITIAL_DOCUMENT_URI  ] Размер содержимого[0] Тип Mime[text/html]
   Заголовки запроса:
      Host[betbase.info]
      User-Agent[Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.0.5) Gecko/2008120122 Firefox/3.0.5]
      Accept[text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8]
      Accept-Language[ru,en-us;q=0.7,en;q=0.3]
      Accept-Encoding[gzip,deflate]
      Accept-Charset[windows-1251,utf-8;q=0.7,*;q=0.7]
      Keep-Alive[300]
      Connection[keep-alive]
      Referer[http://betbase.info/]
      Cookie[options=%26xupdate%3D528%26xtime%3D1233583310%26lang%3Deng%26userid%3Dy8e61233583310]
   Заголовки ответа:
      Date[Mon, 02 Feb 2009 14:01:50 GMT]
      Server[Apache]
      X-Powered-By[PHP/4.4.8]
      Location[http://betbase.info/]
      Keep-Alive[timeout=15, max=99]
      Connection[Keep-Alive]
      Content-Type[text/html]
      Content-Length[0]



16:01:47.550[73мс][всего 73мс] Статус: 302[Found]
GET http://betbase.info/ Флаги загрузки[LOAD_DOCUMENT_URI  LOAD_REPLACE  LOAD_INITIAL_DOCUMENT_URI  ] Размер содержимого[0] Тип Mime[text/html]
   Заголовки запроса:
      Host[betbase.info]
      User-Agent[Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.0.5) Gecko/2008120122 Firefox/3.0.5]
      Accept[text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8]
      Accept-Language[ru,en-us;q=0.7,en;q=0.3]
      Accept-Encoding[gzip,deflate]
      Accept-Charset[windows-1251,utf-8;q=0.7,*;q=0.7]
      Keep-Alive[300]
      Connection[keep-alive]
      Referer[http://betbase.info/]
      Cookie[options=%26xupdate%3D528%26xtime%3D1233583310%26lang%3Deng%26userid%3Dy8e61233583310]
   Заголовки ответа:
      Date[Mon, 02 Feb 2009 14:01:50 GMT]
      Server[Apache]
      X-Powered-By[PHP/4.4.8]
      Pragma[no-cache]
      Cache-Control[no-cache]
      Expires[Thu, 01 Jan 1970 00:00:00 GMT]
      Last-Modified[Mon, 02 Feb 2009 14:01:50 GMT]
      Location[http://www.betbase1.info/?uic=y8e61233583310]
      Keep-Alive[timeout=15, max=98]
      Connection[Keep-Alive]
      Content-Type[text/html]
      Content-Length[0]


16:01:47.626[509мс][всего 509мс] Статус: 302[Found]
GET http://www.betbase1.info/?uic=y8e61233583310 Флаги загрузки[LOAD_DOCUMENT_URI  LOAD_REPLACE  LOAD_INITIAL_DOCUMENT_URI  ] Размер содержимого[0] Тип Mime[text/html]
   Заголовки запроса:
      Host[www.betbase1.info]
      User-Agent[Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.0.5) Gecko/2008120122 Firefox/3.0.5]
      Accept[text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8]
      Accept-Language[ru,en-us;q=0.7,en;q=0.3]
      Accept-Encoding[gzip,deflate]
      Accept-Charset[windows-1251,utf-8;q=0.7,*;q=0.7]
      Keep-Alive[300]
      Connection[keep-alive]
      Referer[http://betbase.info/]
      Cookie[options=%26xupdate%3D531%26xtime%3D1233580822%26userid%3Dy9cf1233578765]
   Заголовки ответа:
      Date[Mon, 02 Feb 2009 14:01:49 GMT]
      Server[Apache/2.0.63 (Unix) mod_ssl/2.0.63 OpenSSL/0.9.8b mod_auth_passthrough/2.1 mod_bwlimited/1.4 FrontPage/5.0.2.2635 PHP/4.4.7]
      X-Powered-By[PHP/4.4.7]
      Set-Cookie[options=%26xupdate%3D532%26xtime%3D1233583309%26userid%3Dy9cf1233578765; expires=Tue, 02 Feb 2010 14:01:49 GMT; path=/; domain=www.betbase1.info]
      Location[http://www.betbase1.info/]
      Keep-Alive[timeout=15, max=100]
      Connection[Keep-Alive]
      Content-Type[text/html]
      Content-Length[0]


16:01:48.138[510мс][всего 2787мс] Статус: 200[OK]
GET http://www.betbase1.info/ Флаги загрузки[LOAD_DOCUMENT_URI  LOAD_REPLACE  LOAD_INITIAL_DOCUMENT_URI  ] Размер содержимого[10544] Тип Mime[text/html]
   Заголовки запроса:
      Host[www.betbase1.info]
      User-Agent[Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.0.5) Gecko/2008120122 Firefox/3.0.5]
      Accept[text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8]
      Accept-Language[ru,en-us;q=0.7,en;q=0.3]
      Accept-Encoding[gzip,deflate]
      Accept-Charset[windows-1251,utf-8;q=0.7,*;q=0.7]
      Keep-Alive[300]
      Connection[keep-alive]
      Referer[http://betbase.info/]
      Cookie[options=%26xupdate%3D532%26xtime%3D1233583309%26userid%3Dy9cf1233578765]
   Заголовки ответа:
      Date[Mon, 02 Feb 2009 14:01:49 GMT]
      Server[Apache/2.0.63 (Unix) mod_ssl/2.0.63 OpenSSL/0.9.8b mod_auth_passthrough/2.1 mod_bwlimited/1.4 FrontPage/5.0.2.2635 PHP/4.4.7]
      X-Powered-By[PHP/4.4.7]
      Pragma[no-cache]
      Cache-Control[no-cache]
      Expires[Thu, 01 Jan 1970 00:00:00 GMT]
      Last-Modified[Mon, 02 Feb 2009 14:01:49 GMT]
      Keep-Alive[timeout=15, max=99]
      Connection[Keep-Alive]
      Content-Type[text/html]
      Content-Length[10544]





получается 4 редиректа с установкой куки и вызов с новыми параметрами

Автор: Platon 2.2.2009, 19:51
Ну, тогда попробуй убрать автоматические редиректы
httpget.setFollowRedirects(false);
и потом анализируй куки на каждом шаге и сравнивай с теми, которые устанавливались в FF.

Автор: googol 2.2.2009, 21:16
Теперь другое дело !
помогло
httpget.setFollowRedirects(false);
да после каждого запроса 
Код

        Header header=httpget.getResponseHeader("Location");
        strURL= header.getValue();
        System.out.println("Target URL: " + strURL);
         httpget = new GetMethod(strURL);


и так пока 
httpclient.executeMethod(httpget);

не вернет 200


не понятно почему 
    httpclient.getParams().setBooleanParameter(HttpClientParams.ALLOW_CIRCULAR_REDIRECTS,true);
не может отработать всего 6 редиректов


Автор: googol 2.2.2009, 21:51
но теперь встала проблема сервер отдает в заголовке пусто Location


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)