2013-07-30 2 views
2

많은 유사한 주제를 선택했지만 여전히 정확한 답변을 찾을 수 없습니다.Android 애플리케이션 쿠키 관리

사용자가 로그인하여 일부 데이터를 검색하기 위해 서버에 연결하는 Android 애플리케이션을 만들려고합니다. 안타깝게도 앱과 서버간에 세션을 유지하기 위해 앱이 필요한 부분을 지나갈 수 없습니다. 올바르게 수행하는 방법을 모르겠습니다.

필자가 읽고 이해하는 한, 프로세스는 다음과 같습니다. 사용자가 로그인 버튼을 클릭하면 서버에 대한 요청이 전송됩니다. 그런 다음 응답이 수신되고 세션 ID가있는 쿠키가 포함됩니다. 나중을 위해 SharedPreferences에 세션 ID를 저장합니다. 다음 활동이로드되면이 ID를 SharedPreferences에서 검색하고 다음 HTTP 요청에 추가하여 올바른 세션을 유지합니다. 틀 렸으면 고쳐줘.

문제는 HTTP 요청에 세션 ID를 추가하는 것입니다. 응용 프로그램이 파괴되어 나중에 다시 열릴 때도 응용 프로그램과 서버 간의 세션을 유지하기 위해 아래 코드에서 변경해야 할 내용은 무엇입니까? 요청에 쿠키가 어떻게 올바르게 추가되어야합니까?

public class LoginScreen extends Activity { 

    DefaultHttpClient httpclient = new DefaultHttpClient(); 
    SharedPreferences prefs; 
    Editor editor; 
    Button login_button; 
    String session_cookie; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState);   
     setContentView(R.layout.activity_login_screen); 

     prefs = this.getSharedPreferences("filetitlehere", Context.MODE_PRIVATE); 
     editor = prefs.edit();  
     session_cookie = prefs.getString("sessionid", "not saved"); 

     if (session_cookie != "not saved") { 
      // intent to another activity 
     } else {    
      login_button = (Button)findViewById(R.id.button_login); 
      login_button.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        ConnectivityManager connMgr = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE); 
        NetworkInfo networkInfo = connMgr.getActiveNetworkInfo(); 

        if (networkInfo != null && networkInfo.isConnected()) { 
        new Login().execute("http://mywebpage.com/login"); 
        } else { 
        // error 
        }     
       } 
      });  
     } 
    } 

    private class Login extends AsyncTask<String, Void, String> { 
     protected String doInBackground(String... url) {    
      try { 
       return auth(url[0]); 
      } catch (IOException e) { 
       return "an error"; 
      } 
     }  
     protected void onPostExecute(String result) { 
      JSONObject jsonobj; 
      Integer user_auth = 0; 

      try { 
       jsonobj = new JSONObject(result); 
       user_auth = jsonobj.getInt("auth");    
      } catch (JSONException e) { 
       // error 
      }  

      if (user_auth == 0) { // in case user not logged in   
       List<Cookie> cookies = httpclient.getCookieStore().getCookies(); 
       for (Cookie ck : cookies) { 
        if (ck.getName() == "PHPSESSID") { 
         // saved in SharedPreferences for later use 
         prefs.edit().putString("sessionid", ck.getValue().toString()).commit(); 
        } 
       } 
      } else { 
       // user already logged in 
       Intent intent = new Intent(getApplicationContext(), HomeScreen.class); 
       intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP); 
       startActivity(intent); 
      } 
     } 
    } 

    private String auth(String myurl) throws IOException {  

     try { 
      HttpPost httppost = new HttpPost(myurl); 

      if (session_cookie == "not saved") { 
       // without adding cookie, cause cookie not saved in SharedPreferences 
       HttpResponse response = httpclient.execute(httppost); 
      } else { 
       // adding sessionid from SharedPreferences 
       BasicCookieStore cstore = new BasicCookieStore(); 
       Cookie cookie = new BasicClientCookie("PHPSESSID",session_cookie); 
       cstore.addCookie(cookie); 
       HttpContext localContext = new BasicHttpContext(); 
       localContext.setAttribute(ClientContext.COOKIE_STORE, cstore);       
       HttpResponse response = httpclient.execute(httppost, localContext); 
      } 

      BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(response.getEntity().getContent())); 
      StringBuilder resp = new StringBuilder(); 
      String line = null;    

      while((line = bufferedReader.readLine()) != null){ 
       resp.append(line); 
      } 
      return resp.toString(); 

     } catch (UnsupportedEncodingException e) { 
      // error 
     } catch (ClientProtocolException e) { 
      // error 
     } catch (IOException e) { 
      // error 
     }  
    } 
} 

일부 다른 질문 :

  • 서버가 경우에만 세션 ID를 전송 하는가를 다음과 같이

    내 코드는 ... 내가 바로 그 일을 해요하지 않는 것 "session_start()"(예 : PHP 포함)가 서버 측에서 시작되었습니다 (예 : 사용자가 로그온 한 경우)?

  • 서버 쪽 세션이 어떻게 든 파괴되지만 이전에 저장 한 쿠키를 요청에 추가하면 어떨까요? 머리말에있는 서버가 무엇을 이해하고 되돌려 보내겠습니까? 다른 sessionid가있을 것인가, 아니면 전혀 없을 것인가?

감사합니다.

답변

1

내가이 질문을 한 지 오래되었습니다. 세션 관리를 직접 작성하는 대신 loopj의 클라이언트 인 http://loopj.com/android-async-http으로 전환했습니다.

모든 것을 해결하고 훌륭하게 작동합니다!

+0

본인이 직접이 문제에 봉착했습니다. [에 내 질문에 링크] (http://stackoverflow.com/questions/31142797/user-session-management-in-android). 도와주세요! –