Вы находитесь на странице: 1из 42

Programacion de Aplicaciones Web

Gestion de Sesiones

Profesor: Ing Msc. Eddy MirandaV.


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;

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.net.*;
import java.util.*;

public class ShowSession extends HttpServlet {


public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
String title = Ejemplo de Manejo de Sesion";
HttpSession session = request.getSession(true);
String heading;
Integer accessCount =
(Integer)session.getAttribute("accessCount");
if (accessCount == null) {
accessCount = new Integer(0);
heading = Bienvenido, Nuevo usuario";
} else {
heading = Otra vez bienvenido";
accessCount = new Integer(accessCount.intValue() + 1);
}
session.putAttribute("accessCount", accessCount);
out.println(ServletUtilities.headWithTitle(title) +
"<BODY BGCOLOR=\"#FDF5E6\">\n" +
"<H1 ALIGN=\"CENTER\">" + heading + "</H1>\n" +
"<H2>Informacion acerca de su sesion:</H2>\n" +
"<TABLE BORDER=1 ALIGN=\"CENTER\">\n" +
"<TR BGCOLOR=\"#FFAD00\">\n" +
" <TH>Info Type<TH>Value\n" +
"<TR>\n" +
" <TD>ID\n" +
" <TD>" + session.getId() + "\n" +
"<TR>\n" +
" <TD>Fecha de Creacion\n" +
" <TD>" +
new Date(session.getCreationTime()) + "\n" +
"<TR>\n" +
" <TD>Fecha dek Ultimo acceso\n" +
" <TD>" +
new Date(session.getLastAccessedTime()) + "\n" +
"<TR>\n" +
" <TD>Number of Previous Accesses\n" +
" <TD>" + accessCount + "\n" +
"</TR>"+
"</TABLE>\n" +
"</BODY></HTML>");
}

/** Handle GET and POST requests identically. */


public void doPost(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.*;

public class ShowItems extends HttpServlet {


public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
HttpSession session = request.getSession();
ArrayList previousItems =
(ArrayList)session.getAttribute("previousItems");
if (previousItems == null) {
previousItems = new ArrayList();
session.setAttribute("previousItems", previousItems);
}
String newItem = request.getParameter("newItem");
response.setContentType("text/html");
PrintWriter out = response.getWriter();
String title = "Items Purchased";
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>" + title + "</H1>");
synchronized(previousItems) {
if (newItem != null) {
previousItems.add(newItem);
}
if (previousItems.size() == 0) {
out.println("<I>No items</I>");
} else {
out.println("<UL>");
for(int i=0; i<previousItems.size(); i++) {
out.println("<LI>" + (String)previousItems.get(i));
}
out.println("</UL>");
}
}
out.println("</BODY></HTML>");
}
}
Mismo Ejemplo con JDK 1.5
•  public class ServletSesion extends HttpServlet {
•  public void doGet(HttpServletRequest request,
•  HttpServletResponse response)
•  throws ServletException, IOException {
•  HttpSession session = request.getSession();
•  ArrayList<String> previousItems =(ArrayList<String>)session.getAttribute
("previousItems");
•  if (previousItems == null) {
•  previousItems = new ArrayList<String>();
•  session.setAttribute("previousItems", previousItems);
•  }
•  String newItem = request.getParameter("newItem");
•  if ((newItem != null) &&
•  (!newItem.trim().equals(""))) {
•  previousItems.add(newItem);
•  }
•  response.setContentType("text/html");
•  PrintWriter out = response.getWriter();
•  String title = "Items comprados";
•  String docType =
• 
Mismo Ejemplo con JDK 1.5(cont)
•  "<!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>" + title + "</H1>");
•  if (previousItems.size() == 0) {
•  out.println("<I>No items</I>");
•  } else {
•  out.println("<UL>");
•  for(String item: previousItems)
•  { out.println(" <LI>" + item);
•  }
•  out.println("</UL>");
•  }
•  out.println("</BODY></HTML>");
•  }
•  }

Вам также может понравиться