2017-08-28 4 views
0

Je suis en train d'implémenter le côté serveur en utilisant PHP API Joomla pour mon application. L'utilisateur envoie des informations de connexion et des processus serveur et crée une session avec succès. Cependant, je suis incapable d'attraper les données de cette session dans Android. J'utilise volley pour effectuer le post, mais plusieurs messages semble créer de nouvelles connexions qui ne devraient pas être le cas, car l'utilisateur est déjà connecté. Je suppose qu'il y a un problème avec les en-têtes envoyés par volée. N'importe qui avec une solution pour cela j'apprécierai. Le côté serveur de note fonctionne à 100%. Le problème est seulement avec android.Gestion de session php dans Android à travers plusieurs activités

protected void doLogin(){ 
    final String username = editTextUsername.getText().toString().trim(); 
    final String password = editTextPassword.getText().toString().trim(); 

    final CookieManager cookieManager = new CookieManager(new PersistentCookieStore(getApplicationContext()), CookiePolicy.ACCEPT_ORIGINAL_SERVER); 
    CookieHandler.setDefault(cookieManager); 

    RequestQueue queue = Volley.newRequestQueue(this); 
    String loginUrl  ="http://loginurl/sesslogin/"; 

    final StringRequest stringRequest = new StringRequest(Request.Method.POST, loginUrl, 
     new Response.Listener<String>() { 
      @Override 
      public void onResponse(String response) { 
       //COOKIE_JAR = cookieManager.getCookieStore().getCookies().toString(); 
       //PersistentCookieStore.getCookies(); 
       // Toast.makeText(getApplicationContext(), response, Toast.LENGTH_LONG).show(); 
       //stringRequest.getHeaders().values() 

       Toast.makeText(getApplicationContext(), response , Toast.LENGTH_LONG).show(); 
      } 
     }, 
     new Response.ErrorListener() { 
      @Override 
      public void onErrorResponse(VolleyError error) { 
       Toast.makeText(getApplicationContext(), "That didn't work!", Toast.LENGTH_LONG).show(); 
      } 
     } 
    ){ 
     @Override 
     protected Map<String,String> getParams(){ 
      Map<String,String> params = new HashMap<String, String>(); 
      params.put(KEY_USERNAME,username); 
      params.put(KEY_PASSWORD,password); 
      return params; 
     } 
    }; 

    queue.add(stringRequest); 
} 

J'ai aussi obtenu une mise en œuvre de préférence partagée et gestionnaire de cookies que j'ai trouvé sur Github et fait partie de mon code. Mais je ne vois aucun impact de ce code.

public class PersistentCookieStore implements CookieStore { 

/** 
* The default preferences string. 
*/ 
private final static String PREF_DEFAULT_STRING = ""; 

/** 
* The preferences name. 
*/ 
private final static String PREFS_NAME = PersistentCookieStore.class.getName(); 

/** 
* The preferences session cookie key. 
*/ 
private final static String PREF_SESSION_COOKIE = "Set-Cookie"; 

private CookieStore mStore; 
private Context mContext; 

/** 
* @param context The application context 
*/ 
public PersistentCookieStore(Context context) { 
    // prevent context leaking by getting the application context 
    mContext = context.getApplicationContext(); 

    // get the default in memory store and if there is a cookie stored in shared preferences, 
    // we added it to the cookie store 
    mStore = new CookieManager().getCookieStore(); 
    String jsonSessionCookie = getJsonSessionCookieString(); 
    if (!jsonSessionCookie.equals(PREF_DEFAULT_STRING)) { 
     Gson gson = new Gson(); 
     HttpCookie cookie = gson.fromJson(jsonSessionCookie, HttpCookie.class); 
     mStore.add(URI.create(cookie.getDomain()), cookie); 
    } 
} 

@Override 
public void add(URI uri, HttpCookie cookie) { 
    if (cookie.getName().equals("sessionid")) { 
     // if the cookie that the cookie store attempt to add is a session cookie, 
     // we remove the older cookie and save the new one in shared preferences 
     remove(URI.create(cookie.getDomain()), cookie); 
     saveSessionCookie(cookie); 
    } 

    mStore.add(URI.create(cookie.getDomain()), cookie); 
} 

@Override 
public List<HttpCookie> get(URI uri) { 
    return mStore.get(uri); 
} 

@Override 
public List<HttpCookie> getCookies() { 
    return mStore.getCookies(); 
} 

@Override 
public List<URI> getURIs() { 
    return mStore.getURIs(); 
} 

@Override 
public boolean remove(URI uri, HttpCookie cookie) { 
    return mStore.remove(uri, cookie); 
} 

@Override 
public boolean removeAll() { 
    return mStore.removeAll(); 
} 

private String getJsonSessionCookieString() { 
    return getPrefs().getString(PREF_SESSION_COOKIE, PREF_DEFAULT_STRING); 
} 

/** 
* Saves the HttpCookie to SharedPreferences as a json string. 
* 
* @param cookie The cookie to save in SharedPreferences. 
*/ 
private void saveSessionCookie(HttpCookie cookie) { 
    Gson gson = new Gson(); 
    String jsonSessionCookieString = gson.toJson(cookie); 
    SharedPreferences.Editor editor = getPrefs().edit(); 
    editor.putString(PREF_SESSION_COOKIE, jsonSessionCookieString); 
    editor.apply(); 
} 

private SharedPreferences getPrefs() { 
    return mContext.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE); 
} 

}

Répondre

0

J'ai identifié la question. Donc, je vais répondre à cela pour toute personne rencontrant le même problème. Le problème était ici;

final CookieManager cookieManager = new CookieManager(new PersistentCookieStore(getApplicationContext()), CookiePolicy.ACCEPT_ORIGINAL_SERVER); 
CookieHandler.setDefault(cookieManager); 

Ce CookieManager doit être installé pour une raison quelconque lors de la méthode onCreate. Aussi le type final n'est pas nécessaire ici. Mon code final est le suivant:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    //INSTANTIATE COOKIE MANAGER 
    CookieManager cookieManager = new CookieManager(new PersistentCookieStore(this.getApplicationContext()), CookiePolicy.ACCEPT_ORIGINAL_SERVER); 
    CookieHandler.setDefault(cookieManager); 
    doLogin(); 
} 
+0

Vous devriez accepter votre propre réponse. – Elin

+0

Ça ne marche pas pour moi, d'autres conseils? – aletede91