php - w3school - Cómo lidiar con tiempos de espera de sesión en solicitudes AJAX
w3 php sql (6)
Estoy seguro de que todos ustedes están familiarizados con los sistemas de votación que usan AJAX (Um ... miren hacia allí <----)
Tengo algo similar y cuando vota hacia arriba o hacia abajo usa AJAX para solicitar el nuevo valor de votes.php. El problema es que estoy usando una sesión para obtener el ID de usuario para que una persona solo pueda votar una vez. ¿Qué sucede si se sientan en la página durante una hora y luego votan para que la sesión ya no esté allí? ¿Cuál sería una buena forma de manejar esta situación? ¿Debo redirigir su página a la pantalla de inicio de sesión? Si es así, ¿cómo puedo hacer eso desde la página votes.php a la que hace referencia la solicitud AJAX? ¿Estoy pasando por alto una buena forma de manejar esta situación? Cualquier consejo sería útil.
Desde la perspectiva del usuario, la mejor solución es mostrar un mensaje y un formulario de inicio de sesión, diciendo algo como "No ha iniciado sesión o se ha agotado el tiempo de espera de la sesión". Digg lo hace muy bien.
En cuanto a la implementación real de AJAX, la sugerencia de swilliams ''401 es sólida. Alternativamente, puede simplemente devolver una cadena específica en caso de falla.
Podría crear una función de javascript que pudiera hacer ping al servidor cada 10 minutos a través de algo así como
setTimeout("Ping()", 60000);
Si desea navegar por el usuario a la página de inicio de sesión si se conecta con una sesión defectuosa, entonces primero verificaría la sesión y, si falla, envíe un
header("Location: ...");
Solo debe almacenar un enlace a la identidad de los usuarios en la sesión. Use las sesiones para identificar a un usuario como x y luego obtenga la información del usuario x de la base de datos.
Si su problema es que el tiempo de espera de las sesiones de los usuarios es superior, debería reconsiderar cómo está utilizando sus sesiones. Tal vez hacer que duren hasta que el navegador se cierra? Si realmente desea que tengan una duración, quizás haga ping al servidor en intervalos para mantener la sesión activa.
Decida en su script php si el usuario debería poder votar o no. Si la sesión no está establecida, o si ya han votado, devuelva un mensaje con el que pueda identificarse en el lado del cliente. Si ya votaron, tal vez devuelvan "voted":"true"
en un objeto JSON. Use JS para analizar este objeto y comprender lo que significa, tomando la acción adecuada. Si la sesión no está configurada, quizás devuelva "session_set":"false"
, y luego haga que javascript se redireccione con window.location = "login.php"
etc.
Solo incremente el contador para el usuario en un retorno exitoso de un voto contado.
Usted estructura el código de Javascript que hace que la solicitud de Ajax acepte un resultado especial (digamos, -1
donde normalmente sería un número >=0
, como, por ejemplo, un conteo de votos) que significa "lo siento, está agotado" y redireccionar a la página de volver a iniciar sesión (que puede tomar como parámetro opcional un mensaje que explique al usuario que se agotó el tiempo de espera, & c).
Considere devolver un estado http de 401 y un objeto JSON que detalle el motivo. Si está utilizando jQuery, eso lo llevará a la devolución de llamada de error()
, que luego puede analizar su objeto.
$.ajax({
data: {},
dataType: ''html'',
success: function(data) {
// do whatever here
},
type: ''POST'',
url: ''myserver.com'',
error: function(XMLHttpRequest, textStatus, errorThrown) {
// XMLHttpRequest.responseText has your json string
// XMLHttpRequest.status has the 401 status code
if (XMLHttpRequest.status === 401) {
location.href = ''login.php'';
}
}
});
Ya no estoy familiarizado con PHP, pero esto debería funcionar para casi cualquier entorno. Sin embargo, puede que tenga que suprimir cualquier redireccionamiento de formulario de inicio de sesión automático. En asp.net mvc, el framework verá el 401 y devolverá el formulario de inicio de sesión predeterminado, con un estado de 200.
Este es un hilo viejo, pero quería compartir mi solución que está funcionando realmente bien.
En mi marco, el sistema redirige al usuario al formulario de inicio de sesión cada vez que intenta acceder a una página y la sesión ha expirado o no es válida. Agregué a la parte superior del formulario de inicio de sesión el siguiente comentario html:
<!--LOGINFORM-->
Creé un contenedor para la función $ .ajax de jQuery que busca esta cadena en cada solicitud, y si está allí, muestra un cuadro emergente de diálogo que dice que se ha agotado el tiempo de espera de la sesión.
Puede usar esto simplemente llamando:
ajax.get(''http://someurl.com'', function(data){
//Do stuff
});
Espero que ayude a alguien.
var ajax = {
check_login : function(resp){
if (resp.substring(0, 16) === "<!--LOGINFORM-->"){
// Show a popup or redirect them to login page!
return true;
}
return false;
},
get : function(url, success){
if (typeof data ==''undefined''){
data = null;
}
$.ajax({
url: url,
type : ''GET'',
success : function(resp){
if (!ajax.check_login(resp)) {
success(resp);
}
},
});
}
};