2011-12-13 3 views
1

나는 그것이 HttpClient와 관련이 있다고 생각하는 문제가 있습니다. 웹 사이트에 로그인하고 JSoup을 사용하여 데이터를 가져옵니다. 모든 것이 잘 작동합니다. 다음은 내 문제입니다. 다른 계정에 로그인 할 때 다른 계정의 동일한 데이터가 표시됩니다. 내가 앱을 죽일 때만 다른 자격 증명으로 로그인 할 수 있습니다. 나는 웹 사이트와의 세션이 동일한 HttpClient에 저장되어 있고 로그 아웃하지 않으면 다른 계정으로 다시 로그인 할 수 없다고 생각합니다. 이 문제를 해결하는 가장 좋은 방법은 무엇입니까? HttpGet 메서드를 사용하여 로그 아웃 스크립트를 실행 하시겠습니까? 또는 HttpCLient를 재설정하는 방법이 있습니다. 감사. 코드 :HttpClient 안드로이드 폐기 또는 닫기

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

httpclient의 "no-cache"헤더를 false로 설정하고 시도해보십시오. 보장 된 해결책이 아닙니다.

1

전체 응용 프로그램 (Singleton)에 대해 HttpClient의 인스턴스를 사용하고 있지만 비슷한 문제가 발생했습니다. 또한

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