2013-04-26 6 views
1

Я пытаюсь перемещаться по сайту после входа в HttpClient.HttpClient не входит в систему

Я начинаю с определения экземпляра HttpClient вместе с печеньем магазина:

public HttpClient httpclient = new DefaultHttpClient(); 
public CookieStore cookieStore = new BasicCookieStore(); 
public HttpContext localContext = new BasicHttpContext(); 
localContext.setAttribute(ClientContext.COOKIE_STORE, cookieStore); 

В одном (Android) BackgroundTask, я войти в веб-сайт успешно.

HttpPost httppost = new HttpPost("http://www.deeproute.com/deeproute/default.asp"); 
List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(); 
nameValuePairs.add(new BasicNameValuePair("cookieexists","false")); 
nameValuePairs.add(new BasicNameValuePair("name", mUser)); 
nameValuePairs.add(new BasicNameValuePair("password", mPassword)); 
nameValuePairs.add(new BasicNameValuePair("subbera", "Login")); 

httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); 
res = httpclient.execute(httppost, localContext); 

После этого, в другом BackgroundTask, я не пытаться подключиться к другой странице, на том же сайте:

HttpGet rosterGet = new HttpGet("http://deeproute.com/deeproute/?sel=rosterlook&myleagueno=6&myteamno=12"); 
res = httpclient.execute(rosterGet, localContext); 

Однако, когда я подключаюсь к этой странице, я больше не вошли в систему Я посмотрел и куки все еще на месте после успешного входа в систему, так что я в недоумении.

Редактировать: для записи этот сайт функционирует нормально, как правило, из обычного браузера.


Edit 2: В ответ на ответ Аарона ниже, кажется, что печенье спасает, потому что если после первого запроса, я делаю это:

List<Cookie> cookies = cookieStore.getCookies(); 
    int cookieSize = cookies.size(); 

    for (int i = 0; i < cookieSize; i++) { 
     Log.v(TAG, "Cookie " + i + "name: " 
           + cookies.get(i).getName()); 
     Log.v(TAG, "Cookie " + i + "value: " 
           + cookies.get(i).getValue()); 
    } 

я вернусь четыре печенья , включая тот, который хранит мое имя пользователя. Если я сделаю то же самое после второго запроса, я верну 6 файлов cookie, потому что, по-видимому, он дает мне новый идентификатор сеанса. Это, кажется, корень проблемы, но я не уверен, как это исправить.

После первого запроса, это мой идентификатор сессии печенье:

name: ASPSESSIONIDSCSCSBCS 
value: GBAJALJBOGKBFLAELPNKEDOE 

И после второго запроса, у меня есть два сеанса ID печенье:

name: ASPSESSIONIDSCSCSBCS 
value: GBAJALJBOGKBFLAELPNKEDOE 

name: ASPSESSIONIDSCSCSBCS 
value: MBAJALJBDBOKPEHNCDDFOCBC 

ответ

-1

Doesnt выглядят как ваши сбережения печенье из первоначальный запрос, поэтому в следующем запросе нет ничего, чтобы сообщить сайту, на котором вы вошли. Вам нужен контейнер cookie. Погугли это.

+1

Спасибо за ответ, но я думаю, что печенье спасает, потому что если напечатать элементы списка печенья, я вижу значение. Также я нашел контейнер для печенья, но единственное, что я смог найти, это CookieManager, который, похоже, применим только к Android WebViews? – user1945153

0

Я столкнулся с той же проблемой. Я реализовал файлы cookie, однако это еще не остался в системе. Я, наконец, получил его работу, поэтому я размещаю этот код, надеюсь, поможет другим с той же проблемой.

Вот пример из Apache о том, как войти в систему и получить все куки: https://hc.apache.org/httpcomponents-client-ga/httpclient/examples/org/apache/http/examples/client/ClientFormLogin.java

Вы также можете посмотреть на Apache в HttpClient документации о «HTTP государственного управления» здесь: https://hc.apache.org/httpcomponents-client-ga/tutorial/html/statemgmt.html

Вот как мой логин функция реализована:

  1. Настройка прокси с помощью CredentialsProvider
  2. установки печенье с использованием BasicCookieStore
  3. Создание пользовательских HttpClient с помощью CloseableHttpClient
  4. Настройка POST запроса:. Мишеням, хост, параметры, пути
  5. Execute POST запрос на /login.html войти в
  6. Выполнение запроса GET на /user, чтобы узнать, правильно ли мы вошли в систему
  7. Печать статус код ответа

    //////// SETUP 
    //Setup Proxy (If needed) 
        CredentialsProvider credsProvider = new BasicCredentialsProvider(); 
        credsProvider.setCredentials(
          new AuthScope("proxy.mycompany", 8080), 
          new UsernamePasswordCredentials("my_username", "my_password")); 
    //Setup Cookies 
        BasicCookieStore cookieStore = new BasicCookieStore(); 
    
    //Build HttpClient 
        CloseableHttpClient httpclient = HttpClients.custom() 
          .setDefaultCredentialsProvider(credsProvider) 
          .setDefaultCookieStore(cookieStore) 
          .build(); 
        HttpHost target = new HttpHost("www.mycompany.com", 80, "http"); 
        HttpHost proxy = new HttpHost("proxy.mycompany", 8080); 
        RequestConfig config = RequestConfig.custom() 
          .setProxy(proxy) 
          .build(); 
    try { 
    //////// LOGIN REQUEST, POST TO /login.html 
    //Start POST Request 
        HttpPost httppost = new HttpPost('/login.html'); 
    //Add parameters to POST Request 
        List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(); 
        nameValuePairs.add(new BasicNameValuePair('username','my_username')); 
        nameValuePairs.add(new BasicNameValuePair('password','my_password')); 
        httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); 
    //Set Config for POST Request 
        httppost.setConfig(config); 
    //Execute POST Request 
        httpresponse = httpclient.execute(target, httppost); 
    //Print Response Code 
        try { 
         System.out.println("Status Code: "+httpresponse.getStatusLine().getStatusCode()); 
        } finally { 
    //Close HTTP Reponse (must be in a 'finally' block) 
         httpresponse.close(); 
        } 
    
    //////// CHECK LOGIN STATUS, GET TO /user 
    //Start GET Request 
        HttpGet httpget = new HttpGet('/user'); 
    //Set Config for GET Request 
        httpget.setConfig(config); 
    //Execute GET Request 
        httpresponse = httpclient.execute(target, httpget); 
    //Print Response Code 
        try { 
         System.out.println("Status Code: "+httpresponse.getStatusLine().getStatusCode()); 
        } finally { 
    //Close HTTP Reponse (must be in a 'finally' block) 
         httpresponse.close(); 
        } 
    } finally { 
        httpclient.close(); 
    } 
    
Смежные вопросы