0

このコードを使用して、Androidアプリからhttp://yearbook08.com/にログインできました。

    String URL="http://yearbook08.com/login.php";

    HttpClient httpclient = new DefaultHttpClient();
    HttpResponse response = null;


    HttpPost httppost = new HttpPost(URL); 
    List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
    nameValuePairs.add(new BasicNameValuePair("userId", uname));
    nameValuePairs.add(new BasicNameValuePair("password", pass));
    try {
        httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
    } catch (UnsupportedEncodingException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    }



    try {
        response = httpclient.execute(httppost);
    } catch (ClientProtocolException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

別のアクティビティに移動すると、http: //yearbook08.com/wall.phpを取得したいのですが、Webサーバーが最後のログインを認識せず、再度ログインするように求められます。

一度ログインした後もログインしたままにする方法はありますか?親切に助けてください!

4

1 に答える 1

1

あなたのコードはセッション管理を考慮していません。これは、ログインが成功した後に Cookie が設定されていないために発生するため、別のリクエストを送信すると、最初の認証が失われ、サーバーはそれを新しいリクエストと見なします。Apache httpcomponents ライブラリ 4.x (特に httpclient) を使用することをお勧めします。

httpcontext を作成し、Cookie ストアを次のようにアタッチします。

// Create a local instance of cookie store
CookieStore cookieStore = new BasicCookieStore();
// Create local HTTP context
HttpContext localContext = new BasicHttpContext();
// Bind custom cookie store to the local context
localContext.setAttribute(ClientContext.COOKIE_STORE, cookieStore);
HttpGet httpget = new HttpGet("http://www.google.com/"); 
// Pass local context as a parameter
HttpResponse response = httpclient.execute(httpget, localContext);

後続のリクエストで同じ localContext を使用してください。また、cookiestore と httpcontext は静的変数またはグローバル変数として宣言する必要があることに注意してください。これらのスコープは、httprequest を運ぶ場所に存在する必要があるためです。自分で Cookie を設定する必要はありません。自動的に行われます。そして、HttpComponents 4.x http://hc.apache.org/httpcomponents-client-ga/index.htmlについて読んでください。

更新 1: v4 と v3 であることを確認してください。basicCookiestore は v4 以降でのみ存在します。basiccookiestore オブジェクトを認識しない v3 を使用していることは明らかです。v4 ライブラリをプロジェクトに追加します。それはあなたの問題を解決します

更新 2 2番目のアクティビティからhttp://yearbook08.com/wall.php を取得しようとすると、2 番目のアクティビティに httpcontext、httpclient、または Cookiestore オブジェクトがないため、この問題が発生します。そのため、新しいリクエストが送信されます。 最初のアプローチ したがって、最初のアクティビティ自体で必要なコンテンツを取得してから、取得したデータを 2 番目のアクティビティに渡す必要があります。このようにして、セッションが維持されます。 2番目のソリューション これに満足できない場合は、これをチェックできます http://www.jameselsey.co.uk/blogs/techblog/android-implementing-global-state-share-data-between-activities-and-across- your-application/アクティビティ全体で httpcontext、cookiestore、および httpclient を共有して、タスクを完了します。

于 2012-07-05T10:29:44.623 に答える