por explorer » 2011-03-17 18:40 @819
En temas de Internet, y sobre todo, web, hay que pensar que el usuario puede realizar cualquier paso en cualquier momento, y por un montón de razones (imagínate que se le va la electricidad de casa justo en ese momento y tiene que volver a entrar).
Para evitar que sea el usuario y el navegador web el que guarden el estado del proceso, lo que se debe hacer es guardar el estado del proceso en el lado del servidor. Al usuario solo le entregaremos una galleta (cookie) que lo identifique en nuestro sistema.
De esa manera, nosotros tenemos toda la información del proceso, toda la información del usuario, todas las condiciones de búsqueda... y nos importa poco si el usuario va hacia adelante o hacia atrás: las reglas del proceso también son nuestras, por lo que no podrá seguir adelante si no cumple con todas las condiciones. Y si va hacia atrás, será porque se le ha olvidado algo, hubo un corte de cobertura en su teléfono móvil o el gato pulsó la tecla de retroceso en el teclado multimedia del usuario (a veces pasa si no le dejamos jugar con el ratón).
Y otro detalle de diseño: en cualquier proceso en que el usuario realiza cualquier proceso "peligroso", se debe tener en cuenta la regresión de esa operación (deshacer el registro o la operación peligrosa).
No puedes evitar el caso de que un usuario recargue la página: va a suceder. Y no importa que inhabilites la tecla F5: el usuario es lo suficientemente inteligente como para descubrir otra manera de recargar la página (y sin intervención gatuna). Incluso capturando eventos del teclado o escondiendo la botonera, no importa: lo va a conseguir.
Debes prever esas circunstancias, y tomar una decisión. Si el usuario decide recargar la consulta y solo tiene derecho a verla una vez, pues le sueltas una página de error, y listo.
Sí que hay una manera de controlar el vuelta a atrás: antes de hacer la consulta y las inserciones, puedes saber de dónde viene el usuario, mirando el campo REFERER de las variables de entorno del CGI. Allí estará indicada la URL de la página de donde viene el usuario. Si no es la página normal, entonces te niegas a hacer la consulta y las inserciones. Pero esto tampoco está garantizado (el navegador web puede usar su caché para presentar la página anterior, y hacerte creer que todo va bien). Por eso, una forma de resolverlo es guardando el estado del usuario: si sabes que el usuario acaba de realizar una operación de inserción, entonces no le dejas hacer más, por mucho que el usuario vuelva hacia atrás. Tu le respondes con la página de error y le ofreces que siga con el proceso.
La idea es que el usuario debe seguir nuestras reglas, por mucha libertad que le dé el navegador. Y nosotros sabemos qué es lo que ha hecho y lo que debemos presentarle y lo que debe respondernos.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES