2014-10-15 7 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()); 

После Я мой ответ Я просто делаю то, что когда-нибудь мне нужно с данными, а затем вещи начинают падать часть. Потому что теперь я просто пытаюсь вызвать свой сервер в той же AsyncTask, чтобы проверить, правильно ли сохранены мои файлы cookie в моем HttpContext.

В первый раз я назвал свой адрес без каких-либо изменений, просто повторно использовать свой текущий HttpContext:

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

Поскольку этот тест не я проверил, чтобы добавить свою ценность печенья на моем HttpPost заголовок:

 httpPost.addHeader(context.getString(R.string.domain),PHPSESSID+"="+cookieID+";"); 

Затем я попытался создать новую HttpContext и заставить COOKIE_STORE:

 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); 

Все выходит из строя, и я уже подтвердил, что, когда я первый получить мой ответ логина я получил данные, ожидаемые от печений, как можно увидеть ниже:

 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]] 
      */ 
     } 

Я уже искал на StackOverflow, и я нашел тонна решений, которые на самом деле не работал для меня, разделит все решения я уже пробовал:

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 («ключ», «значение») вместоOfDeader? Я решил несколько вопросов с этим изменением, и это заставило меня потерять много часов ... Я не знаю, если это проблема, но я думаю, что это достойно доказательства –

+0

Спасибо за предложение, просто протестировали его, и я продолжаю получать тот же ответ (файлы cookie недоступны). – GhostDerfel

+0

Я думаю, что у меня есть код, который может быть вам полезен. Это для подключения Android к серверу Spring mvc с файлами cookie, но я думаю, что tgat, может быть, может вам помочь. Я не против поделиться им с вами. Это не ваш ответ, но позвольте мне помочь вам :).Я приду с ним позже с этим –

ответ

0

Как я уже говорил, здесь вы этот кусок кода, чтобы сделать HttpPost к серверу, разработанной в Spring MVC, с API REST. Пожалуйста, подумайте о том, чтобы построить свой запрос по этому пути:

Пожалуйста,, обратите внимание на комментарии. Вы должны адаптировать его к своему делу;). Вы также можете приложить этот код к методу или тому, что вы предпочитаете.

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

Смежные вопросы