2011-09-15 12 views
8

HttpGetを使用してサーバーに接続している間セッションを保持したいと思います。どのようにCookieを処理するのかを理解する必要があります。HttpGetは自動的にクッキーを処理しますか?

サーバー開発者は、すべてのCookieを自分で処理すると言います。 次のようにHttpGet要求を使用してサーバーにアクセスします。 InputStream isResponse = null;

HttpGet httpget = new HttpGet(strUrl); 
    HttpResponse response = mClient.execute(httpget); 

    HttpEntity entity = response.getEntity(); 
    isResponse = entity.getContent(); 
    responseBody = convertStreamToString(isResponse); 

    return responseBody; 
  1. 私はもっと何かをするべきか?彼は私のデバイスに自動的にクッキーを置くのでしょうか?HttpGetメソッドはクッキーを使ってsessionIDを保持するためにそれを使うことを知っていますか?

  2. セッションが「生きている」かどうかを知るために、デバイスにCookieが存在するかどうかを確認するにはどうすればよいですか?

    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(strUrl); 
    HttpResponse response = mClient.execute(httpget,localContext); 
    

HTTPGETはまだ前と同じクッキーを処理しない:?私はクッキーを取得するには、次のコードを使用する場合は

    1. DefaultHttpClient(上記のコードのmClient)には独自のCookieStoreがあります。次にクッキーを保存し、次にクッキーを作成するにはどうすればいいですか?
  • 答えて

    5

    だから... ... を生き続けるためにシングルトンインスタンスを使用していない場合、は、cookiestoreを使用したクッキーの情報を利用したいですプリミティブCookieStore、私はAndroid Asynchronous Http Clientの実装を見つけました。素晴らしいPersistentCookieStoreが含まれています。 は単に私のプロジェクトにjarファイルを追加し、次のようにそれを使用:

    PersistentCookieStore cookieStore = new PersistentCookieStore(context); 
    DefaultHttpClient mClient = new DefaultHttpClient();  
    mClient.setCookieStore(cookieStore); 
    

    をし、それはそれです!クッキーは保存され、アプリケーションが再び開いたときに再利用されます。

    ありがとうございました。あなたは少なくとも1人の人間を幸せにしました。

    自分のプリミティブの実装に興味のある人は(ということでも動作します)ここにある場合:

    package com.pinhassi.android.utilslib; 
    
    import java.util.Date; 
    import java.util.List; 
    
    import org.apache.http.cookie.Cookie; 
    import org.apache.http.impl.client.BasicCookieStore; 
    import org.apache.http.impl.cookie.BasicClientCookie; 
    
    import android.content.Context; 
    import android.content.SharedPreferences; 
    import android.content.SharedPreferences.Editor; 
    
    public class MyPersistentCookieStore extends BasicCookieStore { 
    private static final String COOKIES_LIST = "CookiesList"; 
    private static final String COOKIES_NAMES = "CookiesNames"; 
    
    private Context mContext; 
    /** 
    * 
    */ 
    public MyPersistentCookieStore(Context context) { 
        super(); 
        mContext = context; 
        load(); 
    } 
    
    @Override 
    public synchronized void clear(){ 
        super.clear(); 
        save(); 
    } 
    
    @Override 
    public synchronized boolean clearExpired(Date date){ 
        boolean res = super.clearExpired(date); 
        save(); 
        return res; 
    } 
    
    @Override 
    public synchronized void addCookie(Cookie cookie){ 
        super.addCookie(cookie); 
        save(); 
    } 
    
    @Override 
    public synchronized void addCookies(Cookie[] cookie){ 
        super.addCookies(cookie); 
        save(); 
    } 
    
    public synchronized void save() 
    { 
        Editor editor = mContext.getSharedPreferences(COOKIES_LIST, Context.MODE_PRIVATE).edit(); 
        editor.clear(); 
        List <Cookie> cookies = this.getCookies(); 
        StringBuilder sb = new StringBuilder(); 
        for (Cookie cookie : cookies) 
        { 
         editor.putString(cookie.getName(),cookie.getValue()); 
         sb.append(cookie.getName()+";"); 
        } 
        editor.putString(COOKIES_NAMES,sb.toString()); 
        editor.commit(); 
    } 
    
    public synchronized void load() 
    { 
        SharedPreferences prefs = mContext.getSharedPreferences(COOKIES_LIST, Context.MODE_PRIVATE); 
        String [] cookies = prefs.getString(COOKIES_NAMES,"").split(";"); 
        for (String cookieName : cookies){ 
         String cookieValue = prefs.getString(cookieName, null); 
         if (cookieValue!=null) 
          super.addCookie(new BasicClientCookie(cookieName,cookieValue)); 
        } 
    
        } 
    
    } 
    
    0

    クッキーを気にする私が持っていなかった。http://hc.apache.org/httpcomponents-client-ga/tutorial/html/statemgmt.html

    はまた、この答えを参照してください。 DefaultHttpClientを作成し、httpclient.execute(httpget);hereとすると、オブジェクトはそのオブジェクトにセッションを格納します。だから最初に私はログインを行い、その後私は私のAPIのプライベート関数を使うことができます。ログアウトする場合は、オブジェクトDefaultHttpClientの新しいインスタンスを作成するか、logout関数を呼び出します。

    だから、場合にあなただけの時間のために私の頭をクラッキングし、私自身を実装した後、オブジェクトにDefaultHttpClient

    +0

    私はDefaultHttpClient(上記のコードでmClient)は、独自のは、cookiestoreを持っていることがわかります。次にクッキーを保存し、次にクッキーを作成するにはどうすればいいですか? –

    +0

    なぜそれをする必要がありますか?次回は新しいCookieを使用します。しかし、まだそれを格納する必要がある場合、私はあなたにそれを行う方法を教えた例のコードを見ることができます。 – Dayerman

    +0

    私はクッキーに保存できるようにする必要があるので、ユーザーがアプリケーションを終了して再度開いたとしても、サーバーへのセッションがあるかどうかを知ることができます(送信したリンク上でそれを行う方法はできません)。同様のことがfacebook APIで行われ、Androidブラウザを使用しているだけです。私は解決策を見つけて答えとしてここに発表しました。とにかく助けてくれてありがとう! –

    関連する問題