2011-05-16 12 views
10

Una característica interesante que encontré en CakePHP fue la capacidad de establecer un mensaje "flash", por ejemplo, en algunos "guardar" script, luego tener ese mensaje se muestra en la página siguiente. Algo así como "Publicación actualizada" o "Error: no se encontró ningún archivo".mensaje flash basado en Cookie vs. sesión

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

¡Salud!

p.s. En mi implementación, también lo desvanezco con el comando "setTimeout" en javascript. Encuentro que es una buena manera de finalizar todo el proceso.

+0

"Estoy tratando de evitar las sesiones como la peste debido a sus extraños requisitos para el scal capacidad". ¿Puedes elaborar? –

+0

Sí, al escalar horizontalmente los servidores web en una granja, no se puede garantizar que el mismo servidor reciba el mismo pedido; por lo tanto, podría procesarse en el Servidor A, generar un mensaje flash de sesión y luego redirigir una página desde Servidor B que no tiene conocimiento de las sesiones del otro servidor. Hay soluciones para esto, pero no son óptimos IMO (es decir, sesiones adhesivas, etc.). – MikeMurko

+0

@MileMurko La solución a ese problema en particular implementado por la mayoría de las aplicaciones de HA es cambiar el controlador de guardar sesión para usar una base de datos o una solución de caché distribuida como Memcache. Esto hace que los datos de la sesión estén disponibles desde cualquier web-head. Si su pregunta es '¿Qué es mejor?', Entonces necesita explicar en detalle por qué no prefiere una solución por sobre la otra. –

Respuesta

4

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

usted tiene 3 opciones:

  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 es recomendable cuando los requisitos de su aplicación incluyen la necesidad de cookies.
  3. Base 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 uso una combinación de los enfoques segundo y tercero: pruebo las cookies y, si están disponibles, las uso. Si no, uso 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.

+5

Si las cookies están desactivadas, ¿funcionarán realmente las sesiones? ¿Las sesiones no se basan en las cookies? (Si no ha habilitado PHPSESSID) – Znarkus

+1

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

+3

Como dice @David, el servidor identifica al usuario sobre múltiples solicitudes almacenando una cookie en su computadora. – Znarkus

4

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

Simplemente haga algunas reglas simples de contenido para asegurarse de que no se coloque información privilegiada en un mensaje flash y usted debería estar bien.

Una aplicación sencilla podría ser algo como procedimental:

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 está originando Soley desde el lado del cliente, se puede usar algo como https://github.com/marcuswestin/store.js para tratar de utilizar tienda localSession para gestionar mensajes flash.

0

Otra idea es el transporte del mensaje por el 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 confía en el reloj del cliente como las cookies
  • Ninguna otra solicitud del cliente puede "robar" el mensaje

Desventaja:

Cuestiones relacionadas