2014-10-15 2 views
0

쿠키를 사용하여 Android 앱에서 내 세션을 유지하려고하지만 내 서버에서 예상되는 응답을받지 못하기 때문에 잘못된 것으로 보입니다.쿠키가없는 HttpContext

처음에는 예상대로 실행되고 예상되는 모든 데이터를 반환하는 로그인 루틴이 있습니다.

내 로그인 요청 :

 HttpContext httpContext = new BasicHttpContext(); 
     HttpResponse response; 
     HttpClient client = new DefaultHttpClient(); 
     String url = context.getString(R.string.url_login); 
     HttpPost connection = new HttpPost(url); 
     connection.setHeader("Content-Type","application/x-www-form-urlencoded"); 
     List<NameValuePair> nameValuePair = new ArrayList<NameValuePair>(2); 
     nameValuePair.add(new BasicNameValuePair(PARAM_LOGIN,params[0])); 
     nameValuePair.add(new BasicNameValuePair(PARAM_PASSWORD,params[1])); 
     connection.setEntity(new UrlEncodedFormEntity(nameValuePair,"UTF-8")); 
     response = client.execute(connection,httpContext); 
     data = EntityUtils.toString(response.getEntity()); 

내 응답을 한 후 난 그냥 데이터로 필요하고 상황이 일부 하락하기 시작 무엇도합니다. 왜냐하면 내 쿠키가 HttpContext에 제대로 저장되었는지 테스트하기 위해 동일한 AsyncTask에서 내 서버를 호출하려고하기 때문입니다.

 httpPost.addHeader(context.getString(R.string.domain),PHPSESSID+"="+cookieID+";"); 
:이 테스트는 내 HttpPost 헤더에 내 쿠키 값을 추가 테스트 실패 이후

 HttpPost httpPost = new HttpPost(context.getString(R.string.url_cookie_test)); 
     HttpResponse response = client.execute(httpPost, httpContext); 

:

는 처음에 난 그냥 내 현재 HttpContext를 재사용, 변경없이 내 URL을 호출했습니다

 CookieStore cookieStore = new BasicCookieStore(); 
     BasicClientCookie cookie = new BasicClientCookie(PHPSESSID, cookieID); 
     cookieStore.addCookie(cookie); 
     HttpContext localContext = new BasicHttpContext(); 
     localContext.setAttribute(ClientContext.COOKIE_STORE, cookieStore); 

     HttpResponse response; 
     HttpClient client = new DefaultHttpClient(); 
     HttpPost httpPost = new HttpPost(context.getString(R.string.url_cookie_test)); 
     response = client.execute(connection,localContext); 

:

는 다음 나는 COOKIE_STORE을 새로운으로 HttpContext를 생성하고 강제로 시도 모두가 실패하고 난 이미 내가 처음 내 로그인 응답을받을 때 내가 아래에 볼 수있는 쿠키에서 예상되는 데이터를 가지고 있음을 확인했습니다 이미에 StackOverflow에 검색 한

 List<Cookie> cookies = ((AbstractHttpClient) client).getCookieStore().getCookies(); 
     for (Cookie cookie: cookies){ 
      Log.i("Cookie Value",cookie.toString()); 
      /* 
       Prints:[[version: 0][name: PHPSESSID][value: 2ebbr87lsd9077m79n842hdgl3][domain: mydomain.org][path: /][expiry: null]] 
      */ 
     } 

을하고 난을 발견했습니다 정말 나를 위해 일하지 않는 솔루션의 톤, 내가 이미 해봤 모든 솔루션을 공유합니다 :

Android: Using Cookies in HTTP Post request

HttpPost request with cookies

Sending cookie with http post android

Apache HttpClient 4.0.3 - how do I set cookie with sessionID for POST request

+0

헤더를 httpPost.setHeader ("key", "value") 대신 addOf addHeader로 추가하지 않으시겠습니까? 나는이 변화로 몇 가지 문제를 해결했고, 많은 시간을 잃어 버렸다 ... 문제가 있는지 나는 알지 못한다. 그러나 나는 증명할 가치가 있다고 생각한다. –

+0

제안을 주셔서 감사 드리며, 나는 계속 시험하고있다. 동일한 응답 (쿠키를 사용할 수 없음). – GhostDerfel

+0

나는 당신에게 좋은 코드 조각이 있다고 생각한다. 쿠키를 사용하여 안드로이드를 Spring mvc 서버에 연결하기위한 것이지만 아마도 tgat가 도움이 될 것입니다. 나는 너와 나누지 않아도 돼. 그것은 당신의 대답이 아니지만, 당신을 도울 수 있습니다 :).나는 그것과 함께 나중에 가겠다. –

답변

0

것은 여기 당신이 API를 REST와, 스프링 MVC에서 개발 한 서버에 httpPost을하기 위해이 코드 조각, 당신에게로. 다음과 같이 요청을 작성하십시오.

에 문의하십시오. 의견에 유의하십시오. 귀하의 케이스에 맞게 수정해야합니다;). 이 코드를 메서드 또는 원하는대로 묶을 수도 있습니다.

try { 

     HttpClient httpclient = new DefaultHttpClient(); 
     HttpPost httppost = new HttpPost("yourPath"); 

     //NameValuePairs is build with the params for your request 

     httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); 
     httppost.setHeader("Content-Type", 
       "application/x-www-form-urlencoded"); 

     CookieStore cookieStore = new BasicCookieStore(); 

     //cookie is a variable that I stored in my shared preferences. 
     //You have to send in it every request 
     //In your case, JSESSIONID should change, because it's for Java. 
     //Maybe it could be "PHPSESSID" 
     BasicClientCookie c = new BasicClientCookie("JSESSIONID", cookie); 

     //JSESSIONID: same comment as before. 
     httppost.setHeader("Cookie", "JSESSIONID="+cookie); 

     cookieStore.addCookie(c); 
     ((AbstractHttpClient)httpclient).setCookieStore(cookieStore); 

     HttpResponse response = httpclient.execute(httppost); 
     HttpEntity entity = response.getEntity(); 
     is = entity.getContent(); 
    } catch (Exception e) { 
     Log.e("log_tag", "Error in http connection" + e.toString()); 
    } 

나는 이것이 도움이되기를 바랍니다 !! "오래된"프로젝트에서 찾기가 어려웠습니다 :)

+1

이것은 정확히 대답은 아니지만 저자가 언급했듯이 그의 도움은 문제를 해결하기에 충분했다. – GhostDerfel