domingo, 24 de septiembre de 2017

Crear y verificar una cookie con 2 lineas en JavaScript

Hay situaciones en las cuales solamente necesitamos crear una cookie simple (nombre y valor) y solo saber si esa cookie existe, para lo cual los métodos en base a crear funciones y todo lo demás, si bien es correcto, en este caso en particular no lo necesitamos, mucho menos si no dominamos el lenguaje de programación JavaScript. Por ejemplo no queremos que se acceda a una determinada página sin antes haber pasado por otra página, es decir, por ejemplo, desde otros sitios, nos enlacen una página que no queremos que se enlace. Una leyenda tipo “Por favor no enlace esta página” a veces sirve, pero no depende de nosotros.

Caso práctico: tenemos Página1 que llama a Página2 y queremos que para que el usuario (o visitante) llegue a la Página2 lo haga a través de la Página1 y no directamente a Página2.

En Página1, dentro de la etiqueta <head> creamos una simple cookie:

<script type="text/javascript">
document.cookie = "permiso=pase";
</script>


Donde “permiso” es el nombre de la cookie y “pase” es el valor. Se puede utilizar cualquier valor, tanto para el name como para el value, que para el caso, no importa el valor que tenga, solo que exista la cookie llamada “permiso”.

En la Página2 también dentro de <head> y de ser posible que sea la primera línea, chequeamos que la cookie creada en Página1 exista y si no existe lo redireccionamos a la Página1 o a donde nos plazca.

<script type="text/javascript">
if (document.cookie.indexOf("permiso") <0 )
  window.location="http://tusitio.com/pagina1";
</script>


Con esto logramos que si la cookie no existe lo mandamos a la Página1 donde se crea la cookie para que pueda ingresar a Página2.

Explicando el código implementado: indexOf devuelve la posición (índice) del array o vector donde se encuentra la cookie, devolviendo -1 en caso de no hallarla. Por eso preguntamos si es menor que cero, ejecutamos la redirección, caso contrario esa instrucción no se ejecuta y se continúa con la carga de la Página2.

También nos ahorramos en código para borrar la cookie, ya que cuando el usuario cierra su navegador, la cookie se elimina.

Sí se manejan páginas dinámicas, por ejemplo, para descargas, del tipo “…view&id=15741” y “…download&id=15741” viniendo a ser esta última la Página2 del ejemplo anterior, debemos agregar unas líneas más de código, correspondientes al manejo de cadena de caracteres.

Veamos como quedaría el código para la Página2 dinámica (el código de la Página1 es el mismo):

Supenemos que la URL actual es http://tusitio.com/download&id=15741 y la URL a la que enviaremos al visitante debe ser http://tusitio.com/view&id=15741. Es decir, debe adaptar la variable URLvolver a la estructura que su sitio utilice.

<script type="text/javascript">
var URLactual = window.location.href;
var indiceY=URLactual.indexOf('&');
var numero=URLactual.substring(indiceY+4);
var URLvolver="http://tusitio.com/view&id="+numero;
if (document.cookie.indexOf("puedo") <0 )
  window.location=URLvolver;
</script>


Ya que el código es de mi autoría, comentaré lo añadido y modificado del ejemplo anterior:

En la variable URLactual almacenamos la URL actual, http://tusitio.com/download&id=15741 que es texto.

La variable indiceY: guarda el valor numérico del índice de “&” de la cadena de texto URLactual obtenida mediante indexOf.

Mediante substring(indiceY+4) obtenemos el número porque extrae la cadena de caracteres de la variable URLactual a partir del índice indicado por el valor de la variable indiceY+4 (“&id=15741” indiceY es la posición de &, indiceY+4 es la posición de 1) y hasta el final de la cadena, de esta forma nos es indistinto la cantidad de cifras del número. El número obtenido (que es texto/string) lo almacenamos en la variable numero.

La variable URLvolver contendrá en texto la URL a la cual redirigiremos al usuario, en este caso le cambiamos el download por  el view, “http://tusitio.com/view&id=“+numero y le concatenamos el número.

En window.location cambia el texto con la URL que teníamos en el ejemplo anterior, por la variable URLvolver.

Una forma más divertida sería hacerlo sin variables:

<script type="text/javascript">
if (document.cookie.indexOf("puedo") <0 )
  window.location="http://tusitio.com/view&id="+window.location.href.substring(window.location.href.indexOf('&')+4);
</script>


Esto me sirvió en su momento para proteger descargas de archivos, es decir, el hotlinking, si me enlazaban directamente la página de la descarga, los mandaba directamente a la página que correspondía, y en base a revisar las estadísticas y recorrido de los usuarios, puede decir que este método funcionó bien.