smart restaurar quitar play philips instalar hoy gratis funciona forzar detencion como cierre cayo carga apps aplicaciones android session http-headers session-state

android - restaurar - twitter no carga



Mantenimiento de la sesiĆ³n en Android(la aplicaciĆ³n permanece autenticada en el servidor) (5)

Aquí hay otra implementación que usa Volley library ... 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 simple de implementar la volea utilizando el patrón de singleton http://arnab.ch/blog/2013/08/asynchronous-http-requests-in-android-using-volley/

Recuerde inicializar mRequestQueue en onCreate () para evitar excepciones inesperadas del puntero nulo

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

Espero que esta ayuda también ...! :)

Estoy construyendo una aplicación de inicio de sesión en Android en la que toco una url (con nombre de usuario y contraseña) hasta esa parte que funciona bien pero después de eso cada vez que toco una url (una vez que el usuario está autenticado), no devuelve nada (es decir, mensaje de error como iniciar sesión primero). Sin embargo, funciona bien en una aplicación de iPhone muy similar y en el navegador.

Llegué a algún lugar que es el error de phpSessionId (es decir, la sesión se destruye para solicitar más) y Si queremos que nuestra aplicación Android se mantenga autenticada en el lado del servidor, tenemos que buscarla luego de la primera conexión y luego enviarla en el encabezados de todas nuestras solicitudes posteriores.

Pero el problema es que no puedo obtener la sessionId del encabezado de la primera conexión y enviarla con otra solicitud junto con el encabezado.

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


Finalmente resolví el problema del manejo de sesiones en Android . Android no puede manejar la sesión en sí (lo que puede hacer un simple navegador), así que debemos manejarla de manera explícita. Cambié un poco el código para la conexión http. Creó una instancia de DefaultHttpClient en la primera Actividad cuando se estableció la conexión.

public static DefaultHttpClient httpClient;

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, utilicé 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 .


Hace un tiempo escribí una publicación acerca de ella en el coderwall Utiliza las clases HttpRequestInterceptor y HttpResponseInterceptor , que son perfectas para ese tipo de situaciones.

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(); } } }

}


La mejor idea es poner toda la función que hace su servidor en la clase única a la que llamarán las tareas que deseen conectarse. Yo llamo a esta clase WebServiceManager. Esta clase tiene exactamente el mismo método que el servidor.

Como quiera una sesión única, haga lo siguiente:

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 llama al método de su instancia de webServiceManager para usar siempre la misma sesión. :)


Mi problema fue que primero inicie sesión y guardé la sesión devuelta en las preferencias del usuario. Después de eso, la llamada POST para establecer un registro dijo

"Error, no se puede autenticar al usuario"

Así que agregué post.setHeader("oAuth-Token", UserPreferences.ACCESS_TOKEN); todo se ve así.

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

. . y resolvió el problema.