Gestión de sesiones de Android
¿Existe una biblioteca específica para la gestión de sesiones de Android? Necesito administrar mis sesiones en una aplicación Android normal. No en WebView
. Puedo fijar la sesión de mi método del poste. Pero cuando envío otra solicitud, esa sesión se pierde. ¿Puede alguien ayudarme con este asunto?
DefaultHttpClient httpClient = new DefaultHttpClient(); HttpPost httppost = new HttpPost("My url"); HttpResponse response = httpClient.execute(httppost); List<Cookie> cookies = httpClient.getCookieStore().getCookies(); if (cookies.isEmpty()) { System.out.println("None"); } else { for (int i = 0; i < cookies.size(); i++) { System.out.println("- " + cookies.get(i).toString()); } }
Cuando intento acceder al mismo host que se pierde la sesión:
- Sesión agotada y cierre automático de sesión de la aplicación después de pocas horas en android
- ¿Cómo puedo administrar la sesión en el inicio / cierre de sesión de Android?
- Hacer un login con facebook usando Facebook SDK 3.0
- Disminuir la verbosidad del registro interno de ORMlite o deshabilitarla
- Implementar reintento Cuando la lógica
HttpGet httpGet = new HttpGet("my url 2"); HttpResponse response = httpClient.execute(httpGet);
Recibo el cuerpo de respuesta de la página de inicio de sesión.
- Iniciar sesión en appengine desde el cliente android
- Android: inicia sesión en el sitio web y conserva sesión / cookie mediante DefaultHttpClient
- SDK de Android Facebook: comprueba si el usuario está conectado o no
- Uso de cookies con solicitudes de Retrofit Robospice
- Inicio de sesión de Android - autenticador de cuentas vs autenticación manual
- Parámetros incorrectos: BadParametersError: Los parámetros eran incorrectos. Queríamos capacidades requeridas en la cuadrícula de Selenium mientras ejecuta Appium
- Android detecta si una aplicación entró en el fondo
- Autorización para Android de Facebook - no puede iniciar sesión cuando se instala la aplicación oficial de Facebook
Esto no tiene nada que ver con Android. Tiene todo que ver con Apache HttpClient, la biblioteca que está utilizando para el acceso HTTP.
Las cookies de sesión se almacenan en su objeto DefaultHttpClient
. En lugar de crear un nuevo DefaultHttpClient
para cada solicitud, sosténgase en él y DefaultHttpClient
a DefaultHttpClient
, y las cookies de sesión se mantendrán.
Puede leer acerca de Apache HttpClient aquí y leer acerca de la gestión de cookies en HttpClient aquí .
Esto es lo que uso para los mensajes. Puedo usar los nuevos httpClients
con este método donde phpsessid
es la identificación de la sesión de PHP
extraída de la escritura de la conexión usando el código que usted tiene arriba.
ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(); nameValuePairs.add(new BasicNameValuePair("PHPSESSID",phpsessid));
Generalmente, en Java HttpURLConnection puede establecer / obtener una cookie de esta manera (aquí está el proceso de conexión completo). El código siguiente está en la ejecución de ConnectingThread (), de la que heredan todas las clases de actividad de conexión. Todos comparten una cadena común sCookie estática que se envía con todas las peticiones. Por lo tanto, puede mantener un estado común como estar conectado / desconectado:
HttpURLConnection conn = (HttpURLConnection) url.openConnection(); //set cookie. sCookie is my static cookie string if(sCookie!=null && sCookie.length()>0){ conn.setRequestProperty("Cookie", sCookie); } // Send data OutputStream os = conn.getOutputStream(); os.write(mData.getBytes()); os.flush(); os.close(); // Get the response! int httpResponseCode = conn.getResponseCode(); if (httpResponseCode != HttpURLConnection.HTTP_OK){ throw new Exception("HTTP response code: "+httpResponseCode); } // Get the data and pass them to the XML parser InputStream inputStream = conn.getInputStream(); Xml.parse(inputStream, Xml.Encoding.UTF_8, mSaxHandler); inputStream.close(); //Get the cookie String cookie = conn.getHeaderField("set-cookie"); if(cookie!=null && cookie.length()>0){ sCookie = cookie; } /* many cookies handling: String responseHeaderName = null; for (int i=1; (responseHeaderName = conn.getHeaderFieldKey(i))!=null; i++) { if (responseHeaderName.equals("Set-Cookie")) { String cookie = conn.getHeaderField(i); } }*/ conn.disconnect();
Manera totalmente transparente de mantener una sesión activa (usuario conectado, o lo que sea) en las aplicaciones de Android. Utiliza el Apache DefaultHttpClient dentro de un Singleton y un HttpRequest / Response Interceptors.
La clase SessionKeeper simplemente comprueba si uno de los encabezados es Set-Cookie, y si lo hace, simplemente lo recuerda. SessionAdder simplemente agrega el identificador de sesión a la solicitud (si no es nulo). De esta manera, todo el proceso de autenticación es totalmente transparente.
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(); } } } }
- Repita la imagen con ImageView en RelativeLayout
- ¿Cómo puedo desactivar el auto show de las consolas ADB en Eclipse?