2011-12-13 19 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

私はアプリケーション全体(HttpClient)のインスタンスを1つ使用していますが、同様の問題が発生しました(シングルトン)。あなたが先制認証を使用するのであれば、その場合には、あなたは、単に(ユーザーがログアウト例えば場合)、アプリケーション全体のクライアントのインスタンスのためにこれを行うことができます。

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

関連する問題