Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


Mantenimiento de la sesión en android (la aplicación permanece autenticada en el lado del servidor)

Estoy construyendo una aplicación de inicio de sesión en android en el que estoy golpeando una url (con nombre de usuario y contraseña) hasta que parte funciona bien, pero después de eso siempre que estoy golpeando una url (una vez que el usuario está autenticado), no devolver nada Mensaje de error como por favor ingrese primero). Sin embargo, funciona bien en la aplicación iphone muy similar y en el navegador.

Tengo en algún lugar que es el error de phpSessionId (es decir, la sesión se destruye para la solicitud adicional) y Si queremos que nuestra aplicación de Android para permanecer autenticado en el lado del servidor que tenemos que buscar ese id después de la primera conexión y luego enviarlo en el Encabezados de todas nuestras solicitudes posteriores.

Pero el problema es que no puedo obtener el sessionId desde el encabezado de la primera conexión y enviarlo con solicitud adicional junto con el encabezado.

Por favor, dame algunos códigos o enlaces para completar la tarea correctamente. Gracias.

  • Actividad de inicio de sesión de Android y redirección de actividad de inicio
  • 5 Solutions collect form web for “Mantenimiento de la sesión en android (la aplicación permanece autenticada en el lado del servidor)”

    Finalmente resolví el problema del manejo de sesiones en Android . Android no puede manejar la sesión en sí (que un simple navegador puede) por lo que tenemos que manejarlo explícitamente. He cambiado el código de conexión http un poco. Se ha creado una instancia de DefaultHttpClient en la primera actividad cuando se estableció la conexión.

    public static DefaultHttpClient httpClient; 

    Para la conexión por primera vez, hice lo siguiente:

     URL url=new URL(urlToHit); LoginScreen.httpClient = new DefaultHttpClient(); //LoginScreen is the name of the current Activity HttpPost httppost = new HttpPost(url.toString()); HttpResponse response = LoginScreen.httpClient.execute(httppost); xr.parse(new InputSource(url.openStream())); //SAX parsing 

    Ahora para todas las conexiones adicionales he utilizado el mismo httpClient Por ejemplo en la siguiente actividad:

     URL url=new URL(urlToHit); HttpPost httppost = new HttpPost(url.toString()); HttpResponse response = LoginScreen.httpClient.execute(httppost); // Log.v("response code",""+response.getStatusLine().getStatusCode()); // Get hold of the response entity HttpEntity entity = response.getEntity(); InputStream instream = null; if (entity != null) { instream = entity.getContent(); } xr.parse(new InputSource(instream)); //SAX parsing 

    Espero que esto te ayude a todos a resolver el problema de la sesión en Android .

    La mejor idea es poner toda la función que hace su servidor en la clase única que va a ser llamada por las tareas que quieren conectarse. Llamo a esta clase WebServiceManager. Esta clase tiene exactamente el mismo método que el servidor.

    Como quiera una sesión única:

     private static WebServiceManager wsm = null; public static WebServiceManager getInstance() { if (wsm == null) { wsm = new WebServiceManager(); } return wsm; } private final HttpClient httpClient; private WebServiceManager() { httpClient=new DefaultHttpClient(); } 

    Y luego llamar al método de su instancia de webServiceManager para utilizar siempre la misma sesión. 🙂

    Mi problema era que primero entré y ahorré la sesión vuelta en userpreferences. Después de que la llamada POST para establecer un registro dijo

    "Error, no se puede autenticar el usuario"

    Así que post.setHeader("oAuth-Token", UserPreferences.ACCESS_TOKEN); añadido post.setHeader("oAuth-Token", UserPreferences.ACCESS_TOKEN); Todo esto se ve así.

     HttpPost post=new HttpPost(URL ); post.setHeader("oAuth-Token", UserPreferences.ACCESS_TOKEN); 

    . . Y resolvió el problema.

    Escribí un mensaje sobre ello un tiempo atrás en coderwall Utiliza las clases HttpRequestInterceptor y HttpResponseInterceptor que son perfectas para ese tipo de escenario.

    Aquí hay un ejemplo:

     public class HTTPClients { private static DefaultHttpClient _defaultClient; private static String session_id; private static HTTPClients _me; private HTTPClients() { } public static DefaultHttpClient getDefaultHttpClient(){ if ( _defaultClient == null ) { _defaultClient = new DefaultHttpClient(); _me = new HTTPClients(); _defaultClient.addResponseInterceptor(_me.new SessionKeeper()); _defaultClient.addRequestInterceptor(_me.new SessionAdder()); } return _defaultClient; } private class SessionAdder implements HttpRequestInterceptor { @Override public void process(HttpRequest request, HttpContext context) throws HttpException, IOException { if ( session_id != null ) { request.setHeader("Cookie", session_id); } } } private class SessionKeeper implements HttpResponseInterceptor { @Override public void process(HttpResponse response, HttpContext context) throws HttpException, IOException { Header[] headers = response.getHeaders("Set-Cookie"); if ( headers != null && headers.length == 1 ){ session_id = headers[0].getValue(); } } } 

    }

    Aquí hay otra implementación usando la biblioteca Volley … una sugerencia muy útil de https://stackoverflow.com/a/36496607/3099185

      CustomRequest jsonObjReq = new CustomRequest(Request.Method.GET, url, null, new Response.Listener<JSONObject>() { @Override public void onResponse(JSONObject response) { Log.d(TAG, response.toString()); } }, new Response.ErrorListener(){ @Override public void onErrorResponse(VolleyError error) { VolleyLog.d(TAG, "Error: " + error.getMessage()); Toast.makeText(getApplicationContext(), error.getMessage(), Toast.LENGTH_SHORT).show(); // hide the progress dialog } }); 

    Clase de solicitud personalizada

     import android.util.Log; import com.android.volley.AuthFailureError; import com.android.volley.Response; import com.android.volley.toolbox.JsonObjectRequest; import org.json.JSONObject; import java.util.HashMap; import java.util.Map; public class CustomRequest extends JsonObjectRequest { private String session_id = ""; public CustomRequest(int method, String url, JSONObject jsonRequest, Response.Listener listener, Response.ErrorListener errorListener) { super(method, url, jsonRequest, listener, errorListener); } public CustomRequest(int method, String url, JSONObject jsonRequest, String session_id, Response.Listener listener, Response.ErrorListener errorListener) { super(method, url, jsonRequest, listener, errorListener); this.session_id = session_id; } @Override public Map getHeaders() throws AuthFailureError { Map headers = new HashMap(); Log.d(TAG, " -> session_id = " + session_id); if(!(session_id.equals(""))) { headers.put("Cookie", this.session_id); } return headers; } } 

    Manera sencilla de implementar la volea usando patrón singleton http://arnab.ch/blog/2013/08/asynchronous-http-requests-in-android-using-volley/

    Recuerde inicializar mRequestQueue en onCreate () para evitar la excepción de puntero nulo inesperado

     @Override public void onCreate() { super.onCreate(); // initialize the singleton sInstance = this; mRequestQueue = Volley.newRequestQueue(this); } 

    Espero que esta ayuda también …! 🙂

    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.