2009-06-17 29 views
13

estoy seguro de que estás familiarizado con los sistemas de votación que utilizan AJAX (Um ... mira justo ahí < ----)¿Cómo lidiar con los tiempos de espera de sesión en AJAX pide

tengo algo similar y cuando vota hacia arriba o hacia abajo utiliza 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.

Respuesta

11

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 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. Usted puede tener que suprimir cualquier redirección de formulario de inicio de sesión automático sin embargo. En asp.net mvc, el marco verá el 401 y devolverá el formulario de inicio de sesión predeterminado, con un estado de 200.

+1

Te daré $ 0 si usted me puede decir cómo devolver correctamente un 401 –

+0

En ASP.NET que acaba de establecer Response.StatusCode = 401; Sin embargo, no podría decirte cómo hacerlo en PHP ... tal vez algún día alguien construya un sitio web que te permita formular preguntas sobre programación ;-p – swilliams

+0

De hecho, lo probé y termina apareciendo un cuadro de autenticación Http pidiendo su nombre de usuario y contraseña Esta no es exactamente la funcionalidad que estoy buscando. –

0

Usted estructurar el código Javascript que hace la petición Ajax para aceptar un resultado especial (por ejemplo, donde un número -1>=0 sería normalmente, como por ejemplo, un recuento de votos) que significa "Bub lo siento, que está suspendido temporalmente "y redireccionar a la página de volver a iniciar sesión (que puede tomar como parámetro opcional un mensaje que explica al usuario el tiempo de espera agotado, & c).

1

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 las sesiones de los usuarios se demoran, 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 quizás 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 se ha establecido, tal vez volver "session_set":"false", y luego hacer redireccionamiento de JavaScript con un window.location = "login.php" etc.

Sólo incrementar el contador para el usuario en un retorno exitoso de un voto contado.

+0

fyi, solo estoy almacenando el ID de usuario en la sesión –

+0

Estaba solo asegurándome de que no estaba del todo claro: x –

0

Se puede crear una función javascript que podría 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 conectar con una sesión defectuoso, lo haría primero verificar la sesión y si no logra enviar un

header("Location: ..."); 

http://ca2.php.net/manual/en/function.header.php

0

Desde la perspectiva del usuario, la mejor solución es para que aparezca 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 hace esto 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.

1

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. que añade a la parte superior de la entrada forman el siguiente comentario html:

<!--LOGINFORM--> 

creé un envoltorio para la función $ .ajax de jQuery que comprueba esta cadena en cada petición, y si es que hay que muestra un cuadro de diálogo ventana emergente diciendo que su sesión ha expirado.

Puede utilizar este con sólo llamar:

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); 
       } 
      }, 
     }); 
    } 
}; 
Cuestiones relacionadas