Funcionamiento de una conexión:
Al pedir un usuario una página nueva el explorador se comunica con el servidor para obtenerla. Esto se realiza en tres pasos mediante el protocolo de red HTTP (Hypertext Transfer Protocol): Establecer la conexión, realizar la transferencia y cerrar la conexión. Durante el establecimiento de la conexión se envía una cierta información que puede ser de gran utilidad como es la dirección IP, versión del explorador, sistema operativo, etc. Todo esto se envía por medio de cabeceras y es este el momento en el que el servidor puede enviar la orden de crear una cookie para que el explorador genere una variable en el ordenador del usuario o iniciar una sesión. Es también en este momento cuando el explorador envía todas las cookies que tiene almacenadas. Una vez se pasa a la parte de transferencia del contenido de una página ya no se puede hacer nada con las cookies ya que se ha terminado el tiempo de transferencia de cabeceras. Por este motivo, cuando se desee enviar una cabecera, crear una cookie o iniciar una sesión, esto se debe hacer al principio del todo, antes de enviar cualquier otro contenido.
Existe una función de PHP que permite controlar en cierta medida las cabeceras que se envían durante la conexión mediante el protocolo HTTP antes del envío del contenido de una página. Existen una gran variedad de cabeceras que se pueden enviar siguiendo el formato de la función header:
booleano header (string cabecera_http; bool reemplazar, entero respuesta)
Nombre | Tipo | Descripción |
cabecera_http | string | Cabecera de HTTP que se envía |
remplazar / respuesta | booleano / entero | Campos opcionales. |
Las cabeceras que más nos van a interesar son:
header("Location: Inicio.htm"); | Esta función redireccióna a la página del servidor "inicio.htm" |
header("WWW-Authenticate: Basic realm=\"Conjunto\""); | Se establecerá un diálogo de identificación del usuario. Los resultados se almacenarán en el array $_SERVER |
<?php if( isset($_SERVER['PHP_AUTH_USER']) AND ($_SERVER['PHP_AUTH_USER'] == "leon" ) AND ($_SERVER['PHP_AUTH_PW'] == "leon2" )) print("<html>\n<body>\n<h1>hola 1</h1>\n</body>\n</html>"); else { header("WWW-Authenticate: Basic realm\"agenda2\""); header("HTTP/1.0 401 Unauthorized"); print("Lá página está protegida"); } ?> |
|
Este método de identificación no es demasiado bueno ya que no permite un "log out" del usuario y además sólo es válido con el servidor Apache. Información acerca de este tema se puede consultar aquí.
Las cookies (o “galletas”) son un método de para con el que se pueden guardar variables en el ordenador del usuario. Dichas variables se podrán utilizar para personalizar el contenido de las páginas a cada uno de los usuarios que accedan a ellas. Una utilidad frecuente son las páginas comerciales en las que se consiguen seleccionar los productos que el usuario está buscando.
El número máximo de cookies por servidor son 20 y en total un explorador tiene permitido llevar hasta 300. De todos modos no es demasiado aconsejable el abuso de cookies ya que son información que se debe enviar al principio y que ralentiza la comunicación. Pongamos por caso que tenemos 10 cookies de 1K, entonces se deberían enviar 10K extra de información. Por otro lado, el usurario puede tener deshabilitadas las cookies por lo que no funcionarían.
Aquí se puede encontrar información sobre las cookies.
La forma de crear una cookie es:
booleano setcookie(string nombre, string valor, int vence, string path, string domain, int seguridad)
Nombre | Tipo |
Descripción
|
nombre | string | Nombre del fichero cookie |
valor | string | Dato para guardar |
vence | entero | Fecha que define el tiempo de vida de la cookie. |
path y domain | string | Con estos dos campos el explorador determina si enviar la cookie o no. Se trata de las carpetas válidas dentro del servidor y el domino al que se corresponden. |
seguridad | booleano | Si verdadero la cookie sólo será mandada cuando la comunicación sea segura. |
Ejemplos:
setcookie(“Prueba”, $valor) | Se crea un cookie llamado prueba. |
setcookie(“Prueba”, $valor,time()+3600) | Ahora además se le da 1 hora de vida. |
setcookie(“Prueba”, $valor,time()+3600,”/pruebas/”,”.undominio.com”,1) | En este caso se establece la cookie para las páginas que estén en la carpeta pruebas del servidor y que estén en el dominio “.undominio.com” |
El cookie se puede leer directamente en el array $_COOKIE[“nombre_cookie”]. También se puede encontrar en el array $_REQUEST[“nombre_cookie”].
$galleta = $_COOKIE[“Prueba”]; | Se lee una cookie llamada Prueba. |
La cookie se borra con el mismo formato que al crearse pero con un tiempo negativo, o simplemente con el valor de la cookie.
setcookie(“Prueba”,” ”,time()-3600); | Se borra la cokie |
setcookie(“Prueba”); |
Ejemplo:
<?php //Creación y lectura de una cookie $valor="Hola, esto es una galleta."; setcookie("Prueba",$valor,time()+3600); ?> <html> <body> <p><strong>La cookie contiene:</strong> <?php print $_COOKIE["Prueba"]; ?></p> </body> </html> |
La cookie contiene: Hola esto es una galleta. |
Para comprobar la anterior página se puede hacer uso de la siguiente:
<html> <body> <p><strong>¿Se recibe la cokie?</strong></p> <p> <?php //Comprobación de la cookie. print $_COOKIE["Prueba"]; ?> </p> </body> <html> |
¿Se recibe la
cookie?
Hola esto es una galleta. |
En el caso de que en la entrada path se ponga el nombre de un directorio (“/7L/prueba/”) la cookie no se envía a páginas que estén contenidas en directorios superiores. Es decir que si guardamos el ejemplo 1b en la carpeta www este no podrá ver la cookie.
Simplemente hay que ir introduciendo uno a uno cada uno de los elementos del vector indicándolo entre corchetes. Por ejemplo, para una cookie llamada “vectorGalleta” con tres valores se haría de la siguiente forma:
setcookie(“vectorGalleta[0]”,$valor1,time()-100);
setcookie(“vectorGalleta[1]”,$valor2,time()-100); setcookie(“vectorGalleta[2]”,$valor3,time()-100); |
Se crea un vector cokie de tres elementos |
Otra alternativa para mantener información a través de distintas páginas es la incorporación de sesiones. En este caso la información se almacena principalmente en el servidor donde se guarda una sesión distinta para cada uno de los usuarios que accedan a la página.
Funcionamiento:
Por cada usuario se asigna un identificador conocido como id de sesión. Este identificador se guarda en forma de cookie en el ordenador del usuario o, si éste tiene las cookies deshabilitadas, se introduce como parte de la dirección URL. Una vez se recibe el identificador en el servidor este ya podrá acceder a toda la información que tenga almacenada en la sesión.
Para ampliar conocimientos de sesiones puedes acudir aquí.
La puesta en marcha puede ser automática si así se configura en la variable session.auto_start del fichero php.ini. Si no está activado su arranque automático se puede arrancar mediante la función:
booleano session_start()
Esta función comprueba si el usuario ya tiene una sesión en marcha y si no es así crea una. La función devuelve siempre TRUE.
Una vez puesta en marcha la sesión se pueden crear variables introduciéndolas en el vector $_SESSION.
$_SESSION[“nombre_dato”] = 1; | Se guarda el valor 1 en la variable de sesion “nombre_dato” |
La lectura de las variables se hace a través del vector $_SESSION, accediendo a las distintas variables al introducir su nombre como puntero dentro del vector.
$dato = $_SESSION[“nombre_dato”]; | Se gurada la variable de sesion “nombre_dato” en la variable $dato. |
Las variables que se han usado en la sesión se pueden borrar por medio de la función unset().
Void unset(mixed variable)
unset($_SESSION[“nombre_dato”]); | Se borra la variable “nombre_dato” |
Para cerrar una sesión el usuario deberá cerrar todas las ventanas del navegador que haya abierto o bien se puede realizar mediante el comando session_destroy();
<?php //contador del número de accesos a una página por sesión. session_start(); if(!isset($_SESSION['count'])) $_SESSION['count'] = 0; else $_SESSION['count']++; ?> <html> <head> <title>Contador de accesos</title> </head> <body> <p> <?php print("Hola, has accedido a esta página "); print($_SESSION["count"]); print(" veces."); ?> </p> </body> </html> |
Hola, has accedido a esta página 2 veces. |
<?php session_start(); if (!isset($_SESSION['bgcol'])) $_SESSION['bgcol'] = 0; if (!isset($_SESSION['textCol'])) $_SESSION['textCol'] = 0; if(isset($_POST['enviar'])) { $bgCol = traduce($_POST['nbgCol']); $textCol = traduce($_POST["ntextCol"]); $_SESSION["bgCol"] = $bgCol; $_SESSION['textCol'] = $textCol; print "<html>\n<head>\n<title>Elección de colores</title>\n</head>\n"; print("<body bgcolor='$bgCol' text=\"$textCol\">"); } else function traduce ($color) { switch ($color) { case "rojo" : return "red"; case "verde" : return "green"; case "azul" : return "blue"; case "cian" : return "cyan"; case "amarillo" : return "yellow"; } } ?> <h2>Elige los tus colores favoritos</h2> <form action='<?php echo($_SERVER["PHP_SELF"]) ?>' method='post'> Color de fondo:<select name='nbgCol'> <option>rojo</option> <option>verde</option> <option>azul</option> <option>cian</option> <option>amarillo</option> </select> <br/><br/><hr width=25% align='left'/><br/> Color del texto:<select name='ntextCol'> <option>rojo</option> <option>verde</option> <option>azul</option> <option>cian</option> <option>amarillo</option> </select> <br/><br/> <input type='submit' name='enviar'> </form> </body> </html> |
Las Cookies y las Sesiones también están implementadas en el lenguaje ASP. En el caso de las Cookies se manejan cómodamente con los objetos de comunicación Response y Request al llamar al procedimiento Cookies. Se utilizará el objeto Response para crear la cookie y mediante el objeto Request se leerán las cookies que se envían desde el usuario.
Response.Cookies("País") = "España" | Se crea una Cookie llamada País en la que se almacena la cadena "España". |
Request.Cookies("País") | Se lee el valor de la Cookie País. |
Las Sesiones sin embargo son un nuevo tipo de objetos con sus propiedades y procedimientos. En este caso también es sencillo retener a información de la sesión. Además se puede acceder a las propiedades del objeto para obtener información adicional como la Id de la sesión o en número de variables que hay almacenadas. Adicionalmente existen unos sucesos que pueden ser de utilidad (Session_OnStat y Session_OnEnd) ya que premiten la realización de determinadas funciones al empezar o terminar una sesión.
Session("Color") = "Rojo" | Se almacena el valor "Rojo" en la variable de sesión Color. |
Session.Contents.Count | Se cuenta cuántas variables de sesión existen. |
Session.Contents.Count.(j) | Se accede a la variable "j-ésima" de la sesión. |
Existe además otra utilidad que incorpora el lenguaje ASP, se trata de la Aplicación. Básicamente consiste en un mecanismo por el cual se premite la compartición de información por varios usuarios en una determinada sesión. De esta manera, cuando varios usuarios están accediendo simultáneamente al mismo servidor, podrán compartir información.
Autor: Francisco Cuesta