2012-08-22 81 views
1

迄今爲止,這已經以不同的方式提出過,但我無法找到解決這個特定問題的解決方案。Android保持登錄狀態,使用cookie來獲取json數據

簡版: 我正在尋求一種方法來從需要身份驗證的URL獲取json。而不是驗證每一次,我希望它存儲接收的餅乾,使其不必重新登錄,並在後續的連接處於登錄狀態

龍版本: 基本上,我想要的應用程序來存儲用戶的用戶名和密碼(作爲具有共享偏好的內部私人字符串)。之後,它會調用登錄URL進行身份驗證並保持登錄狀態(獲取cookie)。一旦完成,我希望程序從不同的URL(例如需要用戶通過cookie登錄)獲取json數據。即使在應用程序暫停或銷燬後,我也希望它保持原位。 它可以被認爲是一個類似於鉻插件的想法,一旦它登錄,它可以簡單地從網站獲取數據。

我認爲對於許多剛剛接觸android的開發人員來說,解決方案很有用。

回答

0

只是爲了不留下問題沒有答案,並解釋我是如何解決問題的,這裏是我的答案。

我採取了使用Loopj Android Async Http Client library,這是主要的應用程序,如Instagram和Pinterest使用。

保持cookie的持久性非常簡單。所有你需要的是:

AsyncHttpClient myClient = new AsyncHttpClient(); // a client instance 

PersistentCookieStore myCookieStore = new PersistentCookieStore(this); 
myClient.setCookieStore(myCookieStore); // setting the cookie store 
0

試試這個IT賣場名PASS用戶和會話到共享PREF

app_preferences = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()); 
    userid=app_preferences.getLong("userid",0); 
    username=app_preferences.getString("username", ""); 

    password=app_preferences.getString("password", ""); 


    session=app_preferences.getString("session", ""); 





class task extends AsyncTask<String, integer, Boolean>{ 
    //httpreqclass htrq= new httpreqclass(); 

    @Override 
    protected void onPreExecute() { 
     // TODO Auto-generated method stub 
     showProgressDialog(); 
    } 

    @Override 
    protected Boolean doInBackground(String... params) { 
     String usr=params[0]; 
     String p=params[1]; 
     String data[]=new String[2]; 
    String ur= "http://192.168.1.45/Android.asmx/Login"; 

     // TODO Auto-generated method stub 
    data= postData(usr,p,ur); 

    boolean sucess=false; 
    try { 
     JSONObject jso = new JSONObject(data[0]); 
     sucess =jso.getBoolean("isSucceeded"); 
     if (sucess) { 
       SharedPreferences.Editor editor = app_preferences.edit(); 

      JSONObject jsr= jso.getJSONObject("result"); 
      Long a= jsr.getLong("Id"); 
      editor.putLong("userid", a); 
       editor.putString("username", usr); 
       editor.putString("password", p); 
       editor.putString("session", data[1]); 

      editor.commit(); // Very important 

     } 

    }catch (Exception e){ 

    } 

     return sucess; 
    } 

    @Override 
    protected void onPostExecute(Boolean result) { 
     // TODO Auto-generated method stub 
    here put code what you want to do next 


    } 



} 

public String[] postData(String u, String p,String url) { 
    String asp = null,data = null; 
    String[] rtrn=new String[2]; 

    //Log.e("i entrd here", ""); 


    try { 
    HttpClient httpclient = new DefaultHttpClient(getHttpParams()); 
      HttpPost httppost = new HttpPost(); 
      HttpResponse response; 
      List<NameValuePair> params = new ArrayList<NameValuePair>();     
      params.add(new BasicNameValuePair("EmailId", u)); 
      params.add(new BasicNameValuePair("PassWord", p));      
      UrlEncodedFormEntity ent = new UrlEncodedFormEntity(params,HTTP.UTF_8); 

    httppost.setEntity(ent); 
      response = httpclient.execute(httppost); 
      Header[] headers; 
     headers = response.getHeaders("Set-Cookie"); 
      //Header atha= respone.getFirstHeader("PHPSESSID"); 
      List<Cookie> cookies = ((AbstractHttpClient) httpclient).getCookieStore().getCookies(); 

      if (cookies.isEmpty()) { 
       Log.d("TAG","no cookies received"); 
      } else { 
       for (int i = 0; i < cookies.size(); i++) { 

        if(cookies.get(i).getName().contentEquals("ASP.NET_SessionId")) { 
        asp = cookies.get(i).getValue(); 
        } 
       } 
       Log.e("this is the cookiee", asp); 
       } 





       HttpEntity entity = response.getEntity(); 
       InputStream is = entity.getContent(); 
       BufferedReader reader = new BufferedReader(new InputStreamReader(is)); 
         StringBuilder sb = new StringBuilder(); 
         String line = null; 
         while ((line = reader.readLine()) != null) { 
          sb.append(line + "\n"); 
         } 
         is.close(); 
         Log.e("", sb.toString()); 
         rtrn[0]=sb.toString(); 
         rtrn[1]=asp; 


     } catch (ClientProtocolException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    return rtrn; 

} 



private HttpParams getHttpParams() { 

     HttpParams htpp = new BasicHttpParams(); 

     HttpConnectionParams.setConnectionTimeout(htpp, 3000); 
     HttpConnectionParams.setSoTimeout(htpp, 5000); 

     return htpp; 
    } 

你可以參考代碼,使應用程序按照您的邏輯

,並注意接下來的時候起,當你發送請求到服務器不要忘記添加會話/ cookie標頭

+0

首先我應該說,非常感謝您花時間編寫代碼。其次,由於幾乎沒有問題,我無法運行代碼。例如,我找不到httpreqclass,pDlg,fetchdata,showProgressDialog ...... 第三,是否有任何形式的漫遊(或者可能是使用上述結構的最終方法)。在github上爲每個人提供一個工作版本可能很有用(或者我最終可以自己做,因爲我認爲這對許多人有用)。 再次感謝 – Sina

+0

sry fr that ...我會把它放在git hub nd在這裏添加thnks –

+0

嗨我編輯了代碼不要忘記更改url和參數到相應的1 s,您有權訪問 –