Investigaciones
Los temas indicados en la actual página
son algunas consultas que se me han hecho a lecheverria_sgc@hotmail.com cuyas respuestas las he encontrado en
internet.
Temas indexados
|
|
|
|
|
Las cookies son datos guardados por los navegadores a instancias del servidor. Los sitios web las utilizan con propósitos diversos: identificación de usuarios, sistemas de personalización, publicidad, estudios de perfil, etc. De hecho la mayor parte de los portales no funcionarían sin cookies, o al menos se verían obligados a implementar algún mecanismo sustitutorio, como por ejemplo la reescritura de parámetros en la URL. Su simplicidad y su gran utilidad hacen de las cookies uno de los recursos más utilizados en el desarrollo de aplicaciones Web.
• Caducidad |
Una cookie es un elemento de información de tamaño reducido enviado
por el servidor para que el navegador lo guarde de manera que se pueda
recuperar su valor en cualquier momento. Una de las características del
protocolo HTTP es que se trata de un protocolo "sin memoria". Esto
significa que, siempre que el usuario sigue un enlace y la página se carga en
el navegador, es como si se hiciera por primera vez, no existiendo ninguna
información disponible con respecto a lo que se cargo o dejó de descargar
anteriormente.
Las cookies nacen con la intención de proporcionar un mecanismo para almacenar en el ordenador de cada usuario datos con los que formar un hilo de comunicación entre las distintas páginas que participan en una aplicación Web. Uno de los casos más típicos es el que se produce cuando se registra en un sitio web. Cuando el mismo usuario visita de nuevo esas páginas, es reconocido de forma automática. Esto es así porque la primera vez que se identifico se creó una cookie en el ordenador local de dicho usuario con los datos necesarios para ser reconocido.
En las versiones actuales de los navegadores las cookies pueden ser activadas o desactivadas de manera voluntaria por el usuario. Otra de las opciones consiste en que el navegador pida permiso cada vez que se quiere establecer o eliminar una cookie:
Si se activa esta opción en el navegador podrá observar fácilmente las cookies que utilizan los distintos sitios web, qué información almacenan y cuándo caducan. Las cookies físicamente se guardan en forma de ficheros de texto en el ordenador. Como en el caso anterior, dependen del navegador que se utilice:
Según el estándar de Netscape (www.netscape.com/newsref/std/cookie_spec.html) existe una limitación con respecto al número de cookies que el navegador puede almacenar así como el tamaño que pueden tener éstas:
En general cuando se exceden los límites, el navegador empieza a descartar aquellas cookies que menos se han utilizado recientemente.
|
|
CADUCIDAD
Todas las cookies tienen un período de caducidad. Cuando
este tiempo se cumple, la cookie desaparece. Teniendo en cuenta este
comportamiento cabe distinguir cuatro tipos de cookies:
DOMINIOS Y SUBDOMINIOS
Toda cookie está vinculada con un dominio o subdominio.
Además existe una restricción impuesta por el propio estándar de manera que no
es posible acceder a cookies de otro dominio o subdominio que no sea el de la
propia URL donde se encuentra la página web. Esto significa que una página web
en la dirección www.idg.es, por ejemplo, sólo podrá acceder a las cookies vinculadas con
los dominios www.idg.es y .idg.es. Como ya se verá más adelante, las distintas
tecnologías, ya sean de cliente o de servidor, disponen de los mecanismos
necesarios para implementar dicho vínculo.
Una
cookie que es del dominio .idg.es será accesible desde cualquier URL que sea
del tipo ordenadores .idg.es, internet.idg.es, o incluso, www.ordenadores.idg.es o www.internet.idg.es. La
restricción se extiende desde el caso general hasta los casos particulares.
Ahora bien, una cookie del dominio www.internet.idg.es no será accesible desde
una página web que se encuentre bajo la dirección URL www.ordenadores.idg.es.
Si se desea que ambos sitios compartan cookies no queda más remedio que éstas
sean del dominio .idg.es, que es compartido por ambos.
LEER, ESTABLECER Y ELIMINAR COOKIES
La mayor parte de la tecnologías relacionadas con Internet
cuentan con recursos necesarios para que los desarrolladores lean, establezcan
y eliminen cookies. Estas tareas pueden llevarse a cabo de diversas formas: a
bajo nivel, manejando las cabeceras HTTP intercambiadas entre el navegador y el
servidor; o bien a alto nivel, utilizando un API que facilite el trabajo del
programador. Además de la distinción anterior existe otra más importante. Las
cookies pueden ser utilizadas en el lado del cliente, por ejemplo mediante
Javascript en una página HTML, o en el lado del servidor, por ejemplo mediante
una página JSP, un servlet, una página CFM, una páginas ASP, etc. A
continuación se analizarán ambas posibilidades desde una perspectiva práctica.
Cookies
con tecnologías de cliente
Las tecnologías de cliente son aquellas que se ejecutan en
el ordenador local que el usuario utiliza para conectarse a la Red. El lenguaje
HTML, por ejemplo, es interpretado por los navegadores y se puede considerar
como una tecnología de cliente. Lo mismo sucede con el lenguaje Javascript.
Este tipo de tecnologías cuentan con serias limitaciones para garantizar la
seguridad de los usuarios así como la privacidad de los datos almacenados en
sus ordenadores. Sin embargo hay muchas tareas que pueden resolverse de esta
manera, aliviando así el trabajo de los servidores que tienen que atender a
numerosas peticiones constantemente.
El lenguaje Javascript es sencillo, versátil y potente, y constituye un excelente complemento para las páginas HTML. En algsunos casos es capaz de llevar a cabo tareas que de otro modo, tal y como se ha señalado, tendrían que ser solucionadas en el lado del servidor, con la carga y el tiempo de espera adicionales que supone. Las cookies son un buen ejemplo de todo esto.
La expresión:
document.cookie
contiene una cadena de texto con el siguiente formato:
nombre1=valor1; nombre2=valor2; nombre3=valor3; ...
El valor de cada cookie está además codificado según el estándar (conocido como urlencoded). Esto implica que los espacios en blanco han sido sustituidos por el signo más (+) y los caracteres especiales se indican en hexadecimal precedidos por un signo de tanto por ciento (%): %xx. Por ejemplo:
NOMBRE= Adolfo%20Aladro%20Garc%Eda;EDAD=29%20a%F1os;
El siguiente ejemplo mostraría el resultado de evaluar la expresión document.cookie.
<HTML>
<HEAD>
<TITLE>Cookies</TITLE>
</HEAD>
<BODY>
<SCRIPT LANGUAGE="JavaScript">
<!--
document.write(document.cookie);
//-->
</SCRIPT>
</BODY>
</HTML>
Si esta página web fuera accesible a través de la URL http://www.idg.es/iworld/ej01.htm se mostrarían todas las cookies del dominio www.idg.es así como del dominio .idg.es.
Para saber si una cookie dada existe, y cuál es su valor, basta con consultar la cadena devuelta por la expresión document.cookie. La función leerCookie que sigue a continuación muestra una manera sencilla de llevar a cabo esta tarea.
function leerCookie(nombre) {
var i;
var a = document.cookie.split(";")
var n, v;
var pos;
for (i=0; i<a.length; i++) {
pos = a[i].indexOf("=");
n = a[i].substring(0, pos);
if (n == nombre) {
return unescape(a[i].substring(1 + pos, a[i].length));
}
}
return null;
}
El método split de una cadena de texto devuelve un array en el que cada uno de sus elementos resulta como consecuencia de dividir dicha cadena en trozos. El parámetro que recibe es la cadena de texto que hace de elemento separador. Considerando el formato devuelto por la expresión document.cookie, es fácil observar que el array devuelto por el método split será
a[0] nombre1=valor1
a[1] nombre2=valor2
a[2] nombre3=valor3
a[3] nombre4=valor4 ···
Cada elemento del array representa una cookie y para separar el nombre del valor es preciso conocer la posición que ocupa el carácter igual (=) dentro del mismo. Esto se logra mediante la expresión:
pos = a[i].indexOf("=");
El método substring recibe dos parámetros, n y m, y devuelve la cadena de texto que se extiende desde el carácter que ocupa la posición n hasta el carácter que ocupa la posición m-1.
Finalmente Javascript proporciona dos funciones, escape y unescape, que sirven para codificar y decodificar respectivamente una cadena de datos según el formato estándar de codificación.
Establecer cookies con Javascript es tan sencillo como asignar a la variable document.cookie una cadena del tipo:
NOMBRE=Adolfo%20Aladro%20Garc%EDa;
expires=Sun,
31 Jan 2010 23:00:00 UTC; path=/; domain=.idg.es
Esta tarea puede crearse mediante una función en Javascript:
function establecerCookie(nombre, valor,
caducidad, ruta, dominio) {
var c = "";
c += nombre + "=" + escape(valor);
c += "; expires=" + caducidad.toGMTString();
c += "; path=" + ruta;
c += "; domain=" + dominio;
document.cookie = c;
}
El parámetro caducidad es un objeto tipo Date. Uno de los métodos de este tipo de objetos es el llamado toGMTString, el cuál nos devuelve una cadena válida para la expresar la fecha de caducidad de una cookie. Así la cookie anteriormente descrita podría establecer de la siguiente manera:
<SCRIPT LANGUAGE="JavaScript">
<!--
var caducidad = new Date(2010,1,1,0,0,0);
establecerCookie("NOMBRE", "Adolfo Aladro García",
caducidad, "/", ".idg.es");
//-->
</SCRIPT>
Por último, eliminar una cookie consiste simplemente en volver a escribirla con una fecha de caducidad que pertenezca al pasado. De este modo el navegador detectará automáticamente que se trata de una cookie caduca y la borrará. La siguiente función muestra como se puede llevar a cabo esta tarea:
function eliminarCookie(nombre, ruta, dominio) {
var c = "";
c += nombre + "=";
c += "; path=" + ruta;
c += "; domain=" + dominio;
var caducidad = new Date(1970, 1, 1, 0, 0, 0);
c += "; expires=" + caducidad.toGMTString();
document.cookie = c;
}
Cookies
con tecnologías de servidor
En la actualidad existe una gran variedad de tecnologías de
servidor para desarrollar sitios web: programas CGI hechos en C o en C++, Perl,
páginas ASP, páginas JSP, servlets, ColdFusion, etc. Todas ellas cuentan con un
mecanismo estándar para establecer, leer y eliminar cookies. A continuación se
estudiarán algunas de las más importantes.
Cookies con Java (Páginas JSP o servlets)
Java es una de las tecnologías que más se utilizan en actualidad a la hora de desarrollar
aplicaciones Web. Cada vez es mayor el número de portales y sitios web que se
han construido utilizando páginas JSP o servlets. Evidentemente el API que se
encuentra por detrás ofrece los recursos necesarios para poder leer y/o
escribir cookies.
En el paquete estándar javax.servlet.http se encuentra la clase Cookie recogida de la siguiente forma:
public class Cookie implements Cloneable
El constructor de la clase se define como:
public Cookie(String name, String value);
El primer parámetro se corresponde con el nombre de la cookie y el segundo con el valor de la misma. El resto de los métodos de la clase cookie se divide en dos grupos: los método getXXX sirven para obtener información de la cookie; los métodos setXXX sirven para establecer las características de la cookie. A continuación de muestra un resumen de ambos grupos:
Métodos getXXX
public String getComment();
public String getDomain();
public int getMaxAge();
public String getName();
public String getPath();
public boolean getSecure();
public String getValue();public void setComment(String purpose);
Métodos setXXX
public void setDomain(String
pattern);
public void setMaxAge(int expiry);
public void setPath(String uri);
public void setSecure(boolean flag);
public void setValue(String newValue);
La mayor parte de los servlets presenta el mismo esqueleto:
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class SiWorldCookiesJava extends
HttpServlet
{
public void service(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException
{
response.setContentType("text/html");
PrintWriter out = new PrintWriter(response.getOutputStream());
// Tareas a llevar a cabo antes de pasar
// a generar el código HTML de la página Web
out.println("<HTML>");
out.println("<HEAD><TITLE>iWorld - Cookies con
Java</TITLE></HEAD>");
out.println("<BODY>");
// Cuerpo de la página
out.println("</BODY>");
out.println("</HTML>");
out.flush();
out.close();
}
}
El objeto representado por la variable request contiene la información relativa a la petición HTTP que ha llegado al servidor, concretamente a ese servlet. Esto incluye las cookies válidas para esa dirección URL. Para conocerlas basta con ejecutar el método getCookies del objeto response. Éste devuelve un array de objetos del tipo Cookie.
Cookie[] c = null;
c = request.getCookies();
if (c != null) {
int iCLength = c.length;
for(int i=0; i<iCLength; i++) {
out.println(c[i].getName() + " = " + c[i].getValue() +
"<BR>");
}
}
El fragmento de código anterior serviría para mostrar el nombre y el valor asociado de cada una de las cookies. Si el servlet SiWorldCookiesJava se ejecutara, por ejemplo, en la dirección URL: http://www.idg.es/ SiWorldCookiesJava la página Web que aparecería en el navegador tendría un listado de todas aquellas cookies definidas para los siguiente dominios www .idg.es y .idg.es. Tal y como se ha visto, el primer dominio es un caso particular del primero.
|
|
Establecer cookies con Java es una tarea igualmente sencilla si bien es preciso tener en cuenta algunas reglas. Las cookies viajan internamente en lo que se conoce como cabeceras HTTP. Éstas forman parte de la respuesta que dan los servidores a las peticiones lanzadas típicamente desde los navegadores. Como su propio nombre indica, las cabeceras HTTP constituyen un conjunto de datos que sirven para que, entre otros muchos propósitos, el navegador conozca la naturaleza de la información que va a recibir en el cuerpo de la respuesta emitida por el servidor (una página HTML, una imagen, un archivo MP3, un ejecutable, etc.). De lo anterior se deduce que una cabecera HTTP emitida por el servidor después de que el cuerpo se haya empezado a mandar no será interpretada como tal por el navegador. Es decir, las cookies deben ser establecidas antes de generar ningún otro dato. En el servlet del ejemplo esto significa antes de abrir el canal de escritura a través del cuál se remite el códgio HTML al navegador.
...
response.setContentType("text/html");
Cookie cookie = new Cookie("NOMBRE","Adolfo Aladro
García");
cookie.setMaxAge(10*365*24*60*60);
cookie.setPath("/");
cookie.setDomain(" .idg.es");
PrintWriter out = new PrintWriter(response.getOutputStream());
...
El método setMaxAge recibe como parámetro el número de segundos que, contados a partir del momento de la creación, han de pasar para que se considere que dicha cookie ha caducado. Según el estándar un valor igual a 0 es equivalente a borrar la cookie.
Cookies con páginas ASP
Las páginas ASP acceden a las cookies mandadas por el navegador utilizando el
objeto estándar llamado Request, de manera similar a lo que sucede con Java. La
sintáxis es la que sigue:
Request.Cookies(cookie)
El parámetro cookie se corresponde con el nombre de la cookie a la que se desea acceder. Así por ejemplo, leer dentro de una página ASP todas las cookies asociadas a una dirección URL dada es algo tan sencillo como hacer:
<% For Each cookie in Request.Cookies %>
<%= cookie %> = <%= Request.Cookies(cookie)%>
<% Next %>
El objeto Response sirve para establecer la cookies. La sintaxis es la que sigue:
Response.Cookies(cookie)[.attribute] = value
El parámetro attribute sirve para indicar las características de dicha cookie y puede tener los siguientes valores: Domain, Expires, Path o Secure. Así por ejemplo es posible establecer una cookie en una página ASP utilizando la siguiente expresión:
<%
Response.Cookies("NOMBRE") = "Adolfo Aladro García"
Response.Cookies("NOMBRE").Expires = "January 1, 210"
Response.Cookies("NOMBRE").Domain = " .idg.es"
Response.Cookies("NOMBRE").Path = "/"
%>
Cuando no se indica la fecha de caducidad se asumen que se trata de una cookie de sesión y por lo tanto se eliminará de manera inmediata cuando la sesión finalice. Este comportamiento es aceptado por la mayor parte de tecnologías.
Cookies con ColdFusion
ColdFusion también cuenta con los mecanismos necesarios
para leer y escribir cookies. En el primero de los casos basta con utilizar una
expresión como la que sigue en este ejemplo:
<CFOUTPUT>#COOKIE.NOMBRE#</CFOUTPUT>
Antes de introducir una expresión como la anterior dentro del código fuente de una página CFM es conveniente determinar la presencia de dicha cookie. Ésta se determina mediante la función IsDefined, tal y como indica el siguiente ejemplo:
<CFIF
IsDefined("COOKIE.NOMBRE")>
<CFOUTPUT>#COOKIE.NOMBRE#</CFOUTPUT>
<CFELSE>
La cookie no está definida
</CFIF>
Si se desea escribir cookies entonces es preciso utilizar la etiqueta CFCOOKIE:
<CFCOOKIE NAME="NOMBRE"
VALUE="Adolfo Aladro García"
EXPIRES="NEVER"
DOMAIN=" .idg.es"
PATH="/">
ColdFusion proporciona algunas palabras reservadas que se pueden utilizar para determinar la fecha de caducidad de la cookie. En el ejemplo anterior se utiliza "NEVER" para establecer un cookie permanente. El resto de los parámetros de la etiqueta CFCOOKIE se interpretan según indica cada nombre.
|
Adolfo
Aladro. [01/01/2001 ]