2012-08-22 53 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,您有权访问 –