Gestión de Sesiones • HTTP no tiene estado • Necesario utilizar trucos para permitirlo: – Reescritura de urls – Campos hidden <input type=“hidden” name=“saludo” value=“hola”> – Cookies – HttpSession Cookies
• Pequeños trozos de información
textual que el servidor puede enviar al cliente y que éste no modifica y reenvía al servidor cuando vuelve a visitar el mismo sitio. Funcion de las Cookies
• Identificar a un usuario concreto.
• Para sitios con baja necesidad de
seguridad, poder evitar el login y password.
• Personalizar las webs recordando
cada peculiaridad de cliente.
• Publicidad enfocada (personalizada)
dado que se puede almacenar información sobre las preferencias del usuario mientras navega, busca información etc. Servlets: Respondiendo: Cookies • Las cookies no son un grave problema de seguridad. • Los navegadores sólo permiten 20 cookies por sitio web y 300 en total. • Limitadas a 4kb. • Pueden ser un problema de privacidad. Puede que algunos usuarios desactiven las cookies por diversas razones por lo que no se recomienda depender completamente del uso de ellas. Cookies: Metodos Servlets: Respondiendo: Cookies • Para utilizar cookies lo único que hay que hacer es: • 1) Crear una cookie: “new Cookie(String name, String value)” El nombre no puede contener ni espacios ni: [ ] ( ) = , " / ? @ : ; • 2) Especificar algún atributo a la cookies mediante alguno de sus métodos: – getComment/setComment: Comentarios asociados a la cookie. Servlets: Respondiendo: Cookies – getDomain/setDomain: Indicar el dominio al que se aplica la cookie. Por defecto la cookie se devuelve a la misma dirección que la envió, pero así podemos indicar que se reenvíe a otros servidores en el mismo dominio. El dominio debe empezar por un ‘.’ – getMaxAge/setMaxAge: Indicar el tiempo que debe pasar en segundos hasta que la cookie expire. Si no se indica la cookie dura una sesión. Servlets: Respondiendo: Cookies – getName/setName: Indicar el nombre de la cookie. – getPath/setPath: Indica a que rutas responde la cookie. Si no se indica nada, la cookie se envía para cualquier página en el mismo path actual. Se podría usar para usos generales como someCookie.setPath ("/"). Hay que incluir al menos el directorio actual. – getSecure/setSecure: Sólo vale para sesiones seguras (e.i. SSL). Servlet: Respondiendo: Cookies – getValue/setValue: Indicar el valor de la cookie. – getVersion/setVersion: Indicar con que version del protocolo funciona esta cookie. • 3) Añadir la cookie a la respuesta: “response.addCookie(Cookie)” Manipulacion de: Cookies Respondiendo: Cookies • Para acceder a las cookies que el cliente reenvía cada vez que accede al recurso se usa el método “getCookies” de “HttpServletRequest” que devuelve un array de cookies. • Con los métodos “getName” y “getValue” de “Cookie” se accede a la información de la cookie. Servlets: Seguimiento de sesión • El protocolo HTTP no posee la capacidad de almacenar estados. • Se complican mucho las tareas de guardar las acciones (e.i. Compras) de un usuario. • 3 posibles soluciones: – Cookies. – Añadir información en la URL – Usar campos ocultos de formularios (HIDDEN) • Revisar: examples\servlets \ej12_cookie_servlet Ejemplo de Cookies • public class PrimerCookie extends HttpServlet { • • public void doGet(HttpServletRequest request, • HttpServletResponse response) • throws ServletException, IOException { • boolean newbie = true; • Cookie[] cookies = request.getCookies(); • if (cookies != null) { • for(int i=0; i<cookies.length; i++) { • Cookie c = cookies[i]; • if ((c.getName().equals("repetirVisitante")) && • (c.getValue().equals("valido"))) { • newbie = false; • break; • }}} Ejemplo de Cookies(Cont) • String title; • if (newbie) { • Cookie visitanteCookie = • new Cookie("repetirVisitante", "valido"); • visitanteCookie.setMaxAge(60*60*24*365); // 1 year • response.addCookie(visitanteCookie); • title = "Bienvenido Abordo"; • } else { • title = "Bienvenido Eddy Miranda"; • } • response.setContentType("text/html"); • PrintWriter out = response.getWriter(); • String docType = • "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 " + • "Transitional//EN\">\n"; • out.println(docType + • "<HTML>\n" + • "<HEAD><TITLE>" + title + "</TITLE></HEAD>\n" + • "<BODY BGCOLOR=\"#FDF5E6\">\n" + • "<H1 ALIGN=\"CENTER\">" + title + "</H1>\n" + • "</BODY></HTML>");}} Gestion de Sesiones con HttpSession Generalidades del API Session § Los Servlets incluye un API Session. § Permiten crear aplicaciones que dependen de los datos del usuario individual. Ejemplos: § Shopping Carts § Personalizacion de servicios § Mantener el estado acerca de la preferencias del usuario. Usando el Session API § Pasos: 1) Obtener el objeto Session del objeto HTTPRequest . 2) Extraer los datos del usuario del objeto Session. 3) Extraer informacion acerca del objeto sesion e.g. cuando fue creada la sesion? 4) Agregar los datos al Objeto Sesion del usuario. Session API Obteniendo el Objeto Session § Para Obtener el objeto sesion,se llama al metodo getSession() de la clase HttpServletRequest. § Ejemplo: HttpSession session = request.getSession(); § Si el usuario tiene una sesion,retorna la ya existente sesion.Si no existe sesion,retorna un nuevo objeto sesion creado. § Si se desea saber si la sesion es nueva se llama al metodo isNew() . Obteniendo el Objeto Session § Si se desea deshabilitar la creacion de nuevas sesiones al metodo getSesion se le pasa el argumeto false. § Ejemplo: HttpSession session = request.getSession(false); § Si no existe una sesion presente,retornara un objeto null. Detras de Escena
§ A cada usuario se le asigna automaticamente un
unico ID de sesion. § Como el usuario obtiene el sessionID? § Option 1: Si el browser suporta cookies, el servlet crea automaticamente un cookie de sesion y almacenara el ID de la sesion dentro del cookie. (En Tomcat, el cookie es llamado: JSESSIONID) § Option 2: Si el browser no soporta cookies, el servlet tratara de extraer el ID de la sesion del URL. Detras de Escena(Cont) Extrayendo datos de una Sesion § El objeto Session trabaja como un Hash Map que permite almacenar cualquier objeto Java . § Por lo tanto se pueden almacenar cualquir numero de claves y sus respectivos valores. § Para extraer un objeto existente, use el metodo getAttribute(. § Nota: Ante del API 2.2, se usaba getValue() en lugar de getAttribute() . Extrayendo datos de una Sesion (cont) § El metodo getAttribute () retornara un objeto de tipo Object ,por ello se debe hacer un casting de tipo. § Example: Integer accessCount = (Integer)session.getAttribute("accessCount"); Extrayendo datos de una Sesion (cont) § Sugerencia: § Si se desea extraer una lis ta de claves asociadas con una sesion, use el metodo getAttributeNames() . § Este metodo retorna un Enumeration de todos los nombres de los atributos. Informacion adicional de la Session § El Session API incluye metodos que retornan informacion especifica de la Sesion. § public String getId(); § Retorna el unico session ID asociado con el usuario, e.g. gj9xswvw9p § public boolean isNew(); § Indica si la sesion ya ha sido creada. § public long getCreationTime(); § Indicates el tiempo en milisegundos desde 1970 en que la sesion fue creada . § public long getLastAccessedTime(); § Indica cuando la sesion fue enviada desde el cliente. Metodos Adicionales § public int getMaxInactiveInterval § Determina el tiempo (en segundos) que una sesion puede permanecer sin acceso antes de ser invalidada. § public void setMaxInactiveInterval (int seconds) § Establece el tiempo (en segundos) que una sesion puede permanecer sin acceso antes de ser invalidada. § Un valor negativo establece que la sesion no puede se invalidada jamas. Agregando Datos a la Session § Para agregar datos a una, use el metodo putAttribute(), y especique el nombre de la clave y el valor. § Ejemplo: § session.putAttribute("accessCount", accessCount); § Para remover el valor, se puede usar el metodo removeAttribute (String name) . Terminando las Sesiones § public void invalidate() § Si el usuario no retorna al servlet por XX minutos*, la sesion es automaticamente invalidada y borrada. § Pero si se quiere invalidar manualmente, se llama al metodo invalidate().
* Ver el metodo getMaxInactiveInterval().
Encodificado de URLs § Si un browser no soporta cookies, existe una forma alternativa de mantener el ID de sesion del usuario. § El Servlet API se hace cargo de este problema agregando el sesion ID a los URL. § Pata agregar automaticamente el ID de sesion al URL use el metodo encodeURL () . Encodificado de URLs(cont) § Ejemplo: § String url = response.encodeURL (originalURL); § Recuerde que se se hace esto cada uno de los URL debe incluir el sessionID. § Ya que esto es dificile asegurar, muchos sitios (e.g. Yahoo requiere cookies.) Ejemplo De Sesion § El presente ejemplo registra el numero de visitas de cada visitante unico del sitio web . § Si esta es la primera visita, el servlet crea una variable de tipo Integer accessCount y la asigna a una sesion. § Si el usuario ha visitado la pagina antes, el servlet extrae la variable the accessCount, la incrementa,y la asigna al objeto Session. § El Servlet tambien despliega otra informacion adicional relativa a la sesion. package coreservlets;