2011-12-13 4 views
1

У меня проблема, которая, я думаю, может относиться к HttpClient. Я вхожу на сайт и извлекаю данные из него с помощью JSoup. Все работает нормально. Вот моя проблема, когда я хочу войти в другую учетную запись, она отображает те же данные из другой учетной записи. Только когда я убью приложение, я могу войти с разными учетными данными. Я думаю, что моя сессия с веб-сайтом все еще хранится в одном и том же HttpClient и не позволит мне снова войти в систему с другой учетной записью, если я не выйду из системы. Какой был бы лучший способ исправить эту проблему? Использование метода HttpGet для выполнения сценария выхода из системы? Или есть способ сбросить HttpCLient. Благодарю. Код:Уничтожение или закрытие HttpClient Android

public void parseDoc() { 
    new Thread(new Runnable() { 

     @Override 
     public void run() { 
      final HttpParams params = new BasicHttpParams(); 
      HttpClientParams.setRedirecting(params, true); 
      httpclient = new DefaultHttpClient(); 

      HttpPost httppost = new HttpPost(
        "https://secure.groupfusion.net/processlogin.php"); 
      String HTML = ""; 
      try { 
       List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(
         3); 
       nameValuePairs 
         .add(new BasicNameValuePair(
           "referral_page", 
           "/modules/gradebook/ui/gradebook.phtml?type=student_view&jli=t&jli=t&jli=t&jli=t&jli=t&jli=t&printable=FALSE&portrait_or_landscape=portrait")); 
       nameValuePairs.add(new BasicNameValuePair("currDomain", 
         "beardenhs.knoxschools.org")); 
       nameValuePairs.add(new BasicNameValuePair("username", 
         username.getText().toString())); 
       nameValuePairs.add(new BasicNameValuePair("password", 
         password.getText().toString())); 
       httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); 

       HttpResponse response = httpclient.execute(httppost); 

       HTML = EntityUtils.toString(response.getEntity()); 
       Document doc = Jsoup.parse(HTML); 
       Element link = doc.select("a").first(); 
       String linkHref = link.attr("href"); 
       HttpGet request = new HttpGet(); 
       try { 
        request.setURI(new URI(linkHref)); 

       } catch (URISyntaxException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
       response = httpclient.execute(request); 

       InputStream in = response.getEntity().getContent(); 
       BufferedReader reader = new BufferedReader(
         new InputStreamReader(in)); 
       StringBuilder str = new StringBuilder(); 
       String line = null; 
       while ((line = reader.readLine()) != null) { 
        str.append(line); 
       } 
       in.close(); 
       HTML = str.toString(); 
       doc = Jsoup.parse(HTML); 
       Elements divs = doc.getElementsByTag("tbody"); 
       for (Element d : divs) { 
        if (i == 2) { 
         finishGrades(); 
         break; 
        } 
        i++; 
        ggg = d.html(); 

       } 

      } catch (ClientProtocolException e) { 
      } catch (IOException e) { 
      } 

     } 
    }).start(); 

} 
+0

приложение еще в памяти, поэтому, только когда приложение убито, вы получаете новые данные для нового входа. Создайте возможность удаления учетных данных или хранения учетных данных. Каждый запуск у вас есть новые экземпляры HttpClient, которые не будут проблемой. –

+0

У вас есть возможность хранить учетные данные, используя «Запомнить меня?». Я добавил в приложение. Я не хочу, чтобы пользователь должен был убить приложение для кого-то еще, чтобы войти в систему со своими учетными данными. Во всяком случае, вокруг этого? Благодарю. – Eli

+0

Убедитесь, что учетные данные удалены из настроек или в любом месте, где вы их храните. Изучите, не вызвало ли это вашу проблему. Предложение: Перезаписывайте их каждый раз, когда новый пользователь регистрируется, а затем приступайте к логину. –

ответ

4

Вы можете позвонить httppost.abort();

+0

Спасибо за ответ, но все равно нет. Это действительно странно, и я не могу понять, где проблема даже в точности. Я знаю, что HttpClient поддерживает мою сессию с веб-сайтом, иначе я даже не смог бы войти в систему и перейти на определенные страницы. благодаря – Eli

0

Я бы предложил установить заголовок «no-cache» httpclient на false и попробовать. Не гарантированное решение.

1

У меня возникла аналогичная проблема, хотя я использую один экземпляр HttpClient для всего приложения (Singleton). Таким образом, в этом случае, если вы используете упреждающие аутентификации, вы можете просто сделать это для экземпляра клиента приложения в масштабах (например, если пользователь выходит из системы):

public void logOut() { 
    // keep in mind, 'httpClient' is final and set once in the constructor (Singleton) 
    httpClient.getCredentialsProvider().clear(); 
    httpClient.getCookieStore().clear(); // important 
} 

Смотри также: HttpClient State Management