java - studio - Gestión de sesión de Android
programacion android pdf 2018 (4)
¿Hay 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 configurar la sesión desde mi método de publicación. Pero cuando envío otra solicitud, la sesión se pierde. ¿Alguien puede 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, la sesión se pierde:
HttpGet httpGet = new HttpGet("my url 2");
HttpResponse response = httpClient.execute(httpGet);
Obtengo el cuerpo de respuesta de la página de inicio de sesión.
En general, en Java HttpURLConnection puede establecer / obtener una cookie de esta manera (aquí está todo el proceso de conexión). El siguiente código se encuentra en la ejecución de ConnectingThread (), del que heredan todas las clases de actividad de conexión. Todos comparten una cadena de sCookie estática común que se envía con todas las solicitudes. 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();
Esto es lo que uso para las publicaciones. Puedo utilizar nuevos httpClients
con este método, donde phpsessid
es el ID de sesión PHP
extraído del script de inicio de sesión utilizando el código que tienes arriba.
ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
nameValuePairs.add(new BasicNameValuePair("PHPSESSID",phpsessid));
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, DefaultHttpClient
y DefaultHttpClient
a utilizarlo, y se mantendrán sus cookies de sesión.
Puede leer acerca de Apache HttpClient here y leer sobre administración de cookies en HttpClient here .
Manera totalmente transparente de mantener activa una sesión (usuario conectado, o lo que sea) en las aplicaciones de Android. Utiliza apache DefaultHttpClient dentro de Singleton y HttpRequest / Response Interceptors.
La clase SessionKeeper simplemente verifica si uno de los encabezados es Set-Cookie, y si lo hace, simplemente lo recuerda. El SessionAdder simplemente agrega el ID de sesión a la solicitud (si no es nulo). De esta forma, 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();
}
}
}
}