2012-07-05 43 views
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但網絡服務器無法識別我的上次登錄並要求我再次登錄。

有沒有辦法可以在登錄後保持登錄狀態?請幫助!

+0

爲什麼不使用用戶名/密碼憑證製作Web服務?如果你這樣做會很容易。 – 2012-07-05 10:08:33

+0

帕雷什!我對此很感興趣,如果您要詳細說明,請致函 – khurram 2012-07-05 10:20:05

+0

通常您提到的方式不是標準和建議的做法。相反,使用PHP/.NET/JAVA創建一個Web服務,通​​過它可以在Web數據庫和Android,iPhone,BB,WP7或任何設備等客戶端之間交換信息。 – 2012-07-05 10:22:22

回答

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活動這個問題會出現的第二次活動取得http://yearbook08.com/wall.php不會有HttpContext的,HttpClient的或它的CookieStore對象這將解決您的問題

更新2 。所以它會發送一個新的請求。 第一種方法 因此,您應該嘗試在第一個活動本身中獲取所需的內容,然後將獲取的數據傳遞給第二個活動。這樣你會保持會話。 第二次soln 如果您對此不滿意,可以查看此信息http://www.jameselsey.co.uk/blogs/techblog/android-implementing-global-state-share-data-between-activities-and-across-your-application/分享httpcontext,cookiestore和httpclient跨活動來完成任務。

+0

謝謝Shikhar,但我已經試過這個,這個問題是當我寫 CookieStore cookieStore = new BasicCookieStore(); 它要求我將其轉換爲 CookieStore cookieStore =(CookieStore)new BasicCookieStore(); 並通過將其轉換爲這樣會使代碼在此行崩潰:( – khurram 2012-07-05 10:33:51

+0

閱讀我的答案。檢查此鏈接http://hc.apache.org/httpcomponents-client-ga/httpclient/apidocs/org/apache/ http/impl/client/BasicCookieStore.html,它提到自v4以來.... – 2012-07-05 10:47:21

+0

我沒有越來越ne在哪裏如何更新http組件版本:/你能幫助嗎? – khurram 2012-07-05 11:25:35

相關問題