Mensaje flash basado en cookies o sesiones

Una característica interesante que encontré en CakePHP fue la capacidad de establecer un flash mensaje, decir en algunos save script, luego muestre ese mensaje en la página siguiente. Algo como, Post updatedo Error - no file found.

La forma en que Cake lo hace es con esto session objeto. Estoy tratando de evitar sesiones como la plaga debido a sus extraños requisitos de escalabilidad. ¿No puedo simplemente almacenar el mensaje flash en una cookie (del lado del cliente) y luego eliminar esa cookie una vez que se muestra en la siguiente página? ¿Cuáles serían algunos pros / contras de este enfoque? O más simplemente, ¿por qué Cake usa session (Supongo que se relaciona con el _SESSION colección).

¡Aclamaciones!

ps En mi implementación también hago que se desvanezca con un setTimeout comando en javascript. Creo que es una buena forma de terminar todo el proceso.

preguntado el 16 de mayo de 11 a las 18:05

"Estoy tratando de evitar sesiones como la plaga debido a sus extraños requisitos de escalabilidad". ¿Puedes elaborar? -

Sí, al escalar los servidores web horizontalmente en una granja, no puede garantizar que el mismo servidor reciba la misma solicitud; por lo tanto, podría estar procesando en el servidor A, generar un mensaje flash de sesión y luego, en la redirección posterior, mostrar una página del servidor. B que no tiene conocimiento de las sesiones del otro servidor. Hay soluciones para esto, pero no son óptimas en mi opinión (es decir, sesiones pegajosas, etc.). -

@MileMurko La solución a ese problema particular implementado por la mayoría de las aplicaciones de alta disponibilidad es cambiar el controlador de guardado de sesión para usar una base de datos o una solución de almacenamiento en caché distribuida como Memcache. Esto hace que los datos de la sesión estén disponibles desde cualquier encabezado web. Si su pregunta es 'Cuál es mejor', entonces necesita explicar en detalle por qué no prefiere inherentemente una solución sobre la otra. -

@MileMurko - Realmente probaría el controlador de sesión de base de datos antes de implementarlo para su plataforma o aplicación. Tenía un cliente que recibía de 12 a 14 mil millones de solicitudes HTTP al mes y no era una fuente de conflicto al usar la sesión respaldada por db, pero también evitaban usar _SESSION para cualquier cosa que no fuera ACL e identidad de usuario mientras reducían la charla al almacenar en caché permanente esto información en Memcache. -

4 Respuestas

El problema con una cookie es que el usuario puede desactivar esta funcionalidad. Si es así, su mensaje flash no se mostrará. CakePHP intenta ser lo suficientemente general y utiliza el almacenamiento de sesiones.

Tienes opciones de 3:

  1. Sesión: el enfoque más utilizado. Funcionará en cualquier computadora cliente pero, como dices, podría dar problemas con algunas configuraciones de servidor.
  2. Cookies: es una buena opción en general, pero el usuario puede bloquear este mecanismo. Solo recomendable cuando los requisitos de su aplicación incluyen la necesidad de cookies.
  3. Bases de datos: la solución universal. El problema es que requiere un acceso a la base de datos (lento). Se debe pasar una ID con la URL (método GET) para que la aplicación sepa qué registro de la base de datos corresponde a este acceso.

En mis aplicaciones utilizo una combinación de los enfoques segundo y tercero: pruebo las cookies y, si están disponibles, las uso. Si no es así, utilizo el acceso a la base de datos, PERO siempre guardo en caché el acceso a la base de datos para no consultar más de una vez por cada mensaje.

respondido 06 mar '14, 20:03

Si las cookies están deshabilitadas, ¿funcionarán realmente las sesiones? ¿Las sesiones no dependen de las cookies? (Si no ha habilitado PHPSESSID) - Znarkus

Pero entonces, ¿cómo persistiría su sesión de una transacción a la siguiente? El almacén de sesiones está en el lado del servidor, pero el token de identidad de la sesión es algo que se debe entregar al cliente para que luego lo devuelva en la siguiente llamada POST / GET. - David

Como dice @David, el servidor identifica al usuario a través de múltiples solicitudes, almacenando una cookie en su computadora. - Znarkus

Si las cookies no están habilitadas en la computadora del usuario, entonces realmente no hay forma de implementar mensajes flash. - danronmoon

No veo por qué no puede usar una cookie con una caducidad de, digamos, 10 minutos desde la fecha de creación. Desventaja si el usuario se aleja y regresa en 11 minutos, es posible que no vea el mensaje de cookie flash ... pero no tendrá que preocuparse por inundar a un cliente con cookies.

Simplemente establezca algunas reglas de contenido simples para asegurarse de que no se incluya información privilegiada en un mensaje flash y debería ser bueno.

Una implementación simple podría ser algo procedimental como:

function setFlash($id ,$message){
   setcookie("flash_{$id}", $message, time() + 60 * 10);
}


function getFlashes(){
   $flashes = array();
   foreach($_COOKIE as $id => $value){
        if(strpos($id, "flash_") === 0){
             $flashes[$id] = $value;
             //clear flash and set expiration to 10 minutes in past
             setcookie($id, "", time() * 60 * -10);

         }
  }
  return $flashes;
   //Input cleansing not included for brevity/clarity
}

Alternativamente, si el flash se origina solo en el lado del cliente, puede usar algo como https://github.com/marcuswestin/store.js para probar y usar la tienda localSession para administrar mensajes flash.

contestado el 17 de mayo de 11 a las 01:05

Otra idea es el transporte del mensaje a través del hash en la url:

if (isset($_POST['submit'])) {
    ...
    header("Location: ".$_SERVER["REQUEST_URI"]."#".urlencode($msg));
    ...
}

ventajas:

  • Funciona sin cookies / sesiones / bases de datos / memcaches, etc. :-)
  • No depende del reloj del cliente como lo hacen las cookies
  • Ninguna otra solicitud del cliente puede "robar" el mensaje

Desventaja:

contestado el 23 de mayo de 17 a las 13:05

Dependiendo de la implantación, también corre el riesgo de que alguien inyecte en la página y haga algo como dominio.com?error=" necesita hacer clic en este enlace para corregir este error link.com "- Mav2287

Desafortunadamente, las sesiones no siempre son confiables cuando van seguidas de Encabezado ("Ubicación ...");

Estaba pensando en ponerlo en la solicitud GET o en la etiqueta Hash como se sugirió, y puede borrarlo en la página siguiente usando javascript de la URL usando window.history.pushState.

Editar: A menos que session_write_closed (); se utiliza.

Respondido el 01 de diciembre de 18 a las 19:12

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.