2015-07-30 2 views
1

У меня проблема с моим Android-приложением и файлами php.PHP-сессии не работают в Android?

У меня есть два PHP файлов: * первый подключаются после долгих если/другие блоков:

[...] 
else{ 

       $response["message"]="Connexion OK"; 

       session_start(); 
       $_SESSION['id'] = $id; 
       $_SESSION['pseudo'] = $pseudo; 
       $_SESSION['options'] = $options; 
       $response['session'] = $_SESSION['id']; 
      } 
[...] 
echo json_encode($response); 

Моего второго файл только вернуться, если он подключен или нет:

<?php 

session_start(); 
$response =0; 

    if(isset($_SESSION['id'])){ 
     $response= 1; 
    } 



echo $response; 

? >

Когда я выполняю URL-адрес файлов в Firefox, в следующем порядке: 1/второй, у меня есть 0 2/Первый кусок 3/Второе, я получаю 1

Файлы Php хорошо конструируются!

Теперь я хочу сделать это в AsyncTasks Android: где бы я ни был, в первую очередь хочу проверить подключение пользователя к второму файлу: но возврат всегда 0 ... не подключен, даже после того, как я был зарегистрирован с первым, который вызывается в Connexion Activity.

Есть ли что-то еще в Android для открытия сеансов Php?

Спасибо за ответы,


Вот мой код: У меня есть AsyncTask для связи:

private class AddDataAsyncTask extends AsyncTask<Void, Void, Void> { 
     String message = ""; 
     [...] //preExecute 
     @Override 
     protected Void doInBackground(Void... params) { 


      Log.i("add", " start doInBackground"); 

      // Making a request to url and getting response 

      String urlt = url; 
      if (nameValuePair != null) { 
       String paramString = URLEncodedUtils.format(nameValuePair, "utf-8"); 

      } 
      String response = ""; 
      try { 

       DefaultHttpClient httpClient = new DefaultHttpClient(); 

       CookieStore cookieStore = new BasicCookieStore(); 
            HttpContext localContext = new BasicHttpContext(); 
            localContext.setAttribute(ClientContext.COOKIE_STORE, cookieStore); 

       HttpGet post = new HttpGet(urlt); 
       HttpResponse rp = httpClient.execute(post); 
       if (rp.getStatusLine().getStatusCode() != HttpStatus.SC_OK) { 
        // Server is unavailable 
       } 
       response = EntityUtils.toString(rp.getEntity()); //here is your response 

      } catch (ClientProtocolException e) { 
       e.printStackTrace(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
      /* } catch (UnsupportedEncodingException e) { 
       e.printStackTrace(); 
      */ 
      if (response != null) { 
       try { 

        JSONObject JsonResponse = new JSONObject(response); 
        message = JsonResponse.getString("message"); 

        if (message.equals("Connexion OK")) 
         session = Integer.parseInt(JsonResponse.getString("session")); 
         Log.i("connnnnnexionC", response); 
       } catch (JSONException e) { 

        e.printStackTrace(); 
       } 
      } 

      return null; 

[...] // postExecute }

И мой AsyncTask, где я хочу проверить связь:

 private class VerifierConnexionAsyncTask extends AsyncTask<Void, Void, Void> { 
       [...] //preExecute 

       @Override 
       protected Void doInBackground(Void... params) { 

        String response = ""; 
        try { 

         DefaultHttpClient httpClient = new DefaultHttpClient(); 
         HttpEntity httpEntity = null; 
         HttpResponse httpResponse = null; 


         CookieStore cookieStore = new BasicCookieStore(); 
         HttpContext localContext = new BasicHttpContext(); 
         localContext.setAttribute(ClientContext.COOKIE_STORE, cookieStore); 

         HttpPost httpPost = new HttpPost(url); 
         httpResponse = httpClient.execute(httpPost); 
         httpEntity = httpResponse.getEntity(); 
         response = EntityUtils.toString(httpEntity); 
         Log.i("connnnnexion",response); 
        } catch (ClientProtocolException e) { 
         e.printStackTrace(); 
        } catch (IOException e) { 
         e.printStackTrace(); 
        } 

        return null; 
       } 

    [...]//postExecute 
      } 

Сначала я ввожу чек результат:

I/connnnnexion: 0

Я хожу в Connexion активность и я вошел, используя первый AsyncTask: Я получил:

I/connnnnnexionC : { "сообщение": "Connexion OK", "сессия": "27"}

Так хорошо соединить

Я повторно чек, и снова у меня есть:

I/connnnnexion: 0


РЕШЕНИЕ Я написал новый класс присоединен:

import org.apache.http.client.CookieStore; 
import org.apache.http.client.protocol.ClientContext; 
import org.apache.http.impl.client.BasicCookieStore; 
import org.apache.http.protocol.BasicHttpContext; 
import org.apache.http.protocol.HttpContext; 
public class Connecte { 
    static CookieStore cookieStore; 
    static HttpContext localContext; 

    public static void makeCookie(){ 
     cookieStore = new BasicCookieStore(); 
     localContext = new BasicHttpContext(); 
     localContext.setAttribute(ClientContext.COOKIE_STORE, cookieStore); 
    } 


} 

В связи AsyncTask добавить: Connexion.makeCookie():

HttpGet post = new HttpGet(urlt); 
       Connecte.makeCookie(); 
       HttpResponse rp = httpClient.execute(post, Connecte.localContext); 

И в чековой AsyncTask я просто добавить:

HttpPost httpPost = new HttpPost(url); 
       httpResponse = httpClient.execute(httpPost, Connecte.localContext); 

ответ

2

Вы должны убедиться, что соединение используется повторное использование тех же куки. PHP управляет сеансами, задавая каждому клиенту файл cookie PHP_SESSION и отслеживает различные значения на основе вашего PHP_SESSION. Если вы не будете отслеживать это между каждым запросом, то php будет думать, что вы каждый другой клиент.

CookieHandler.setDefault(new CookieManager(null, CookiePolicy.ACCEPT_ALL));


DefaultHttpClient httpClient = new DefaultHttpClient(); 
HttpEntity httpEntity = null; 
HttpResponse httpResponse = null; 

CookieStore cookieStore = new BasicCookieStore(); 
HttpContext localContext = new BasicHttpContext(); 
localContext.setAttribute(ClientContext.COOKIE_STORE, cookieStore); 

HttpPost httpPost = new HttpPost(url); 

httpResponse = httpClient.execute(httpPost, localContext); 
httpEntity = httpResponse.getEntity(); 

Убедитесь в том, чтобы использовать тот же объект localContext во всех последующих запросах, так все они разделяют одни и те же куки и могут сохраняться в PHP сессии.

+0

@ ImFabien75 Если это вам помогло, пожалуйста, примите/повысите его. – d0nut

+0

Благодарим вас за ответ. Перед тем, как перенести его, просто чтобы убедиться: я пишу: CookieHandler.setDefault (новый CookieManager (null, CookiePolicy.ACCEPT_ALL)); в каждом действии, когда я хочу протестировать Connexion, перед тем, как открыть php-файл? – ImFabien75

+0

@ ImFabien75 вы пишете что? Ваш комментарий отключен – d0nut

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