Teoria 5.2 - Sesiones

download Teoria 5.2 - Sesiones

of 24

Transcript of Teoria 5.2 - Sesiones

  • 7/22/2019 Teoria 5.2 - Sesiones

    1/24

    Prof. Laur Fava TTPS 2013

    Sesiones en javaSesiones en java

    1

    2

    3

    4

    Cmo mantener el estado con el protocolo HTTP

    Mecanismosdeintercambio deIDparamanejar sesiones

    - Cookies

    - URL rewriting

    LainterfaceHTTPSession

    - Ligar yeliminar elementos

    - Invalidar sesin

    MtodosdelainterfaceHttpServletRequest paraobtener unasesin

    Soportedesesionesen servletsy JSP: un ejemplo

    Sesionesen ambientesmulti- servidores

    5

    6

  • 7/22/2019 Teoria 5.2 - Sesiones

    2/24

    Prof. Laur Fava TTPS 2013

    Soporte de SesionesSoporte de Sesiones

    HTTP (Hypertext Transfer Protocolo)es un protocolo sin estado, orientado a

    conexin. Los pares requerimiento y respuesta HTTP son independientes unos deotros. El servidor web NO sabesi unaseriederequerimientosprovienen del mismo odediferentesclientesy si estn adems, relacionadosentres.

    Unasesinconsisteen unaseriedeinteraccionesrelacionadasqueserealizan entreunmismo navegador web y un servidor web, durante un perodo de tiempo. Unasesintieneinformacin o estado correspondienteaun clienteparticular.

    La clave para construir aplicaciones web es identificar todos los requerimientosprovenientes de un mismo cliente remoto y mantener el estado entre esosrequerimientos.

    El servidor no recuerdaqueambos requerimientosvienen del mismo cliente

  • 7/22/2019 Teoria 5.2 - Sesiones

    3/24

    Prof. Laur Fava TTPS 2013

    ServletOrden deCompras

    ServletCatlogo

    Contenedor Web

    Tiempo

    Durantela sesin, sedeberan transferir lositems seleccionados.

    Soporte de SesionesSoporte de Sesiones

    Selecciona items

    Servidor Web

    Navega

    Cmo hacemos desde una aplicacin web para identificar qurequerimientos provienen de un mismo cliente?Cmo mantenemos el

    estado entre los diferentes requerimientos?

    Ordenar Compra

  • 7/22/2019 Teoria 5.2 - Sesiones

    4/24

    Prof. Laur Fava TTPS 2013

    Una de las funciones ms importantes de la API de Servletes el gerenciamiento(creacin, expiracin y mantenimiento del estado delasesin por usuario) desesionesatravsdelainterfacejavax.servlet.http.HttpSession.

    Esta API es una interface de alto nivel, construida sobre cookies y reescrituradeURL. En general, los servidores usan cookies si el browser lo soporta, yautomticamenterevierten arescrituradeURL cuando lascookiesno son soportadasoestn deshabilitadas.

    El programador de servlets no necesita preocuparse por los detalles, no tiene quemanipular explcitamente cookies ni agregar informacin a la URL y adems, se legarantizaun lugar en el contenedor paraalmacenar datosasociadoscon cadasesin.

    Laespecificacin deServletsobligaaloscontenedoreswebaproveer soportepara objetosHttpSession. Loscontenedoresusan lainterfaceHttpSession paracrear una sesin entre un cliente HTTP y un servidor HTTP. Los objetos almacenanatributos que son nicos para un cliente especfico, y existen a travs de mltiplesrequerimientosHTTP.

    Soporte de Sesio

    neSoporte de Sesio

    neLa API ServletLa API Servlet

  • 7/22/2019 Teoria 5.2 - Sesiones

    5/24

    Prof. Laur Fava TTPS 2013

    Cuando se crea un objetoHttpSession, se le asocia una identificacin nica,ID desesin,queseleentregaal clientemediantecookies/ rescrituradeURL.

    Cadavez queel cliente interactacon unacomponentededichaaplicacin web, el clienteproveeal servlet (o jsp) el IDdesesin(asignado previamente).

    ServletOrden deCompras

    ServletCatlogo

    Contenedor Web

    Tiempo

    1 requerimiento

    1 respuesta http (ID=123)

    Navega

    Soporte de SesioneSoporte de Sesio

    neSe necesitaSe necesita unun ID de sesiID de sesinnniconico

    HTTPSession

    SessionID=123

    chango=

    password=

    HTTPSession

    SessionID=456

    chango=

    password=

    Servidor Web

    Otra respuesta HTTP

    (ID=123)

    Otro requerimiento HTTP

    (SESSION ID=123)

  • 7/22/2019 Teoria 5.2 - Sesiones

    6/24

    Prof. Laur Fava TTPS 2013

    Soporte de SesioneSoporte de Sesio

    neccmo intercambian ID el cliente y el contenedor?mo intercambian ID el cliente y el contenedor?

    Dealgunamanera, el contenedor tienequecrear un ID desesin y enviarlo comopartede larespuesta, y el clientetienequeenviar devueltael ID delasesin comoparte de los requerimientos subsiguientes. La manera ms comn y ms simpleparael intercambio delainformacin esatravsdecookies.

    El contenedor envauna cookiecon el ID

    desesin,Set-Cookiees otro

    headerdela respuesta

    El clienteenva con elrequerimiento lacookiecon el ID de

    sesin.

    qu pasa si deshabilitan las cookies?

  • 7/22/2019 Teoria 5.2 - Sesiones

    7/24

    Prof. Laur Fava TTPS 2013

    Si el cliente no usacookies, se puedeusar URL rewritingcomo alternativa. URL rewritingsiempretrabaja.

    Soporte de SesioneSoporte de SesioneGarantizando el funcionamiento de sesionesGarantizando el funcionamiento de sesiones

    El ID desesin vuelvecomo una informacin extraal final dela URL del requerimiento

    URL rewritingtoma el ID que va en la cookie y lopega a la derecha de la URL que se enva en larespuesta.

    El mecanismo usado por defecto por losservidoresweb paraenviar el identificador escookiesy automticamente (si el programador lo indic) revierten a rescritura de URL cuando las

    cookiesno son soportadaso estn deshabilitadas.

  • 7/22/2019 Teoria 5.2 - Sesiones

    8/24

    Prof. Laur Fava TTPS 2013

    Soporte de SesioneSoporte de SesioneRescritura de URL (Rescritura de URL (URLURL r ew r it ingrewr i t ing))

    out . pr i nt l n( Segui r ) ;

    out . pr i nt ( Segui r ) ;

    r esponse. sendRedi r ect ( / appl i c/ Mi Ser vl et )r esponse. sendRedi r ect ( response.encodeRedirectURL(/applic/MiServlet))

    La API de servlet facilita la rescritura de URL, a travs del 2 mtodos de la claseHttpServletResponse, loscualesincluyen automticamenteel IDdesesinenlaURL.

    Ejemplos de uso: /applic/MiServlet;jsessionid=OAAB6C8DE415

    Si lascookiesno funcionan, el contenedor revierteaURL rewriti ng, pero solamentesi el programador hahecho el trabajo extra, decodificar todaslasURLsqueseenvanen larespuesta.Si no se indicaexplcitamente que se codifiquen las URLs y el cliente no aceptacookies, entonces, no sepodrusar sesiones.

    cmo se hace?

    - encodeURL(java.lang.String url): t oma como par met r o una ur l yr est or na un St r i ng r epr esent ando l a ur l con el i d de l a sesi n.- encodeRedirectURL(java.lang.String url): t r abaj a de l a mi sma maner aper o se ut i l i za par a r edi r ecci n.

  • 7/22/2019 Teoria 5.2 - Sesiones

    9/24

    Prof. Laur Fava TTPS 2013

    Soporte de SesionesSoporte de SesionesEl objeto HTTPSessionEl objeto HTTPSession

    Un objeto HttpSessionesuncontenedor dedatosqueresideen el contenedor web y quemantienedatosparaun clienteparticular.Cuando se invoca al mtodogetSession()se obtiene una instancia de una clase queimplementala interfaceHttpSession. Laclaseesespecficadecadacontenedor.Qupodemoshacer con esteobjeto?En general ligar/ recuperar objetosdealcancesesin.

    Liga un objetoa la sesin con el nombreoclave pasadocomoparmetro. Cualquier objetoligadopreviamentecon elmismonombreserreemplazado.

    Elimina un objeto dealcancesesin, cuyo nombrecoincidecon el parmetro. Devuelvenull si no existe

    un objeto ligado con esenombre.

    Devuelveun objetoligadoalasesin con el nombrepasado

    como parmetro. Usualmente el objeto retornado es unainstanciadeunasubclasedeObjecty necesitasercasteadoantesdeserusado.

  • 7/22/2019 Teoria 5.2 - Sesiones

    10/24

    Prof. Laur Fava TTPS 2013

    Soporte de SesionesSoporte de SesionesEl objeto HTTPSessionEl objeto HTTPSession

    Un objetoHttpSessiontambin nospermite manejar tiemposdelasesin, conocer losltimosaccesoseinvalidarla.

    Especifica el mximotiempo en

    segundos que ser permitidoentre los requerimientos de unclienteparalasesin.

    Invalida la sesin y elimina todos losobjetos ligados eella.

    Devuelven la fecha decreacin y el ID desesin

    asignado

    Devuelveun valor boolean queindicasi la sesin es nueva, esto es, no se

    ha recibido del clienteun

    requerimiento con ID todava

    Cundo se invalidar una sesin?

  • 7/22/2019 Teoria 5.2 - Sesiones

    11/24

    Prof. Laur Fava TTPS 2013

    LosobjetosHttpSession tienen un tiempo devidafinito. Unasesin puedeexpirar (t ime-out) pordoscausas:

    20

    Los contenedoresestablecen un tiempo de

    vida por defecto.

    Soporte de SesionesSoporte de Sesionesinvalidando una sesiinvalidando una sesinn

    porque fue invalidadapor la aplicacin. Una aplicacin puede invalidar una sesin en cualquiermomento, invocando el mtodoinvalidate() del objetoHttpSession. Si unasesin noes explcitamente invalidada, ser invalidadaautomticamente despus de un cierto perodo detiempo.

    porque permaneci inactiva un determinado perodo de tiempo,prefijado como mximoperododeinactividad.El perodo detiempo queunasesin puedeestar ociosaantesdequeexpire, sepuedeconfiguraren el archivo web.xml, paratodaslassesiones:

    1

    2

    Tambinsepuedeestablecerun perodo mximo deinactividadaunasesinparticular:

    . . .

    sesion.setMaxInactiveInterval(24*60);

    Cambia el time-out de una sesin, sinafectar el time-out de restos de las

    sesiones de la aplicacin web

  • 7/22/2019 Teoria 5.2 - Sesiones

    12/24

    Prof. Laur Fava TTPS 2013

    La interface HttpServletRequest, adems de permitir recuperar parmetros, atributos,informacin del cliente, tienemtodostilesparacrear y recuperar sesiones.

    Chequea si el ID de sesin enviado con elrequerimiento proviene de una Cookie o derescrituradeURL respectivamente. Ambos mtodosretornan true/false

    Devuelve la sesin actual asociada alrequerimiento, ocreauna nuevaslosibooleanestrue.

    Devuelve la sesin actual asociada alrequerimiento, o si el requerimiento no tienesesin asociada,creaunanueva.

    boo lean )

    isRequestedSessionFromCookie()

    isRequestedSessionFromURL()

    Soporte de SesionesSoporte de SesionesMMtodostodostiles de la interfacetiles de la interface HttpServletRequestHttpServletRequest

  • 7/22/2019 Teoria 5.2 - Sesiones

    13/24

    Prof. Laur Fava TTPS 2013

    Soporte de SesionesSoporte de Sesionesccmo se obtiene una sesimo se obtiene una sesin?n?

    Usando el mtodogetSession(), deun objetoHttpServletRequest,se le indicaal contenedor quesequierecrear o usar unasesin y elcontendor web hace casi todo eltrabajo!

    HttpSession sesion = request.getSession();

    Cualquier componente web puede contener el siguiente cdigo:

    if (elrequest incluyeID desesin)

    Serecuperael ID sesin y sebuscalasesin (objeto HttpSession)else

    Creaunanuevasesin

    Le preguntamos al objetorequest por unasesin y el contenedor hacetodo. Estemtodo, la1 vez, adems de crear la sesin, causa queuna cookieseaenviadacon larespuesta

    CreaunobjetoHttpSession GeneraunIDdesesin Creaunobjetocookiey leasociael IDdesesin Setealacookieenlarespuesta(headerset-cookieheader)

  • 7/22/2019 Teoria 5.2 - Sesiones

    14/24

    Prof. Laur Fava TTPS 2013

    Cliente Servidor

    getSession()

    Sesin

    Se devuelve el ID de sesin

    Primer requerimiento a una componente queusa sesin

    El ID de sesines retornado en la respuesta HTTPcomo una cookie (o como parte de una url)

    El ID de sesines enviado en los siguientesrequerimientos HTTP

    El cliente se uni a la sesin

    getAttibute(clave)

    setAttibute(clave, valor)

    invalidate()

    Time-out

    oLog-outdel cliente

    Soporte de SesionesSoporte de Sesionesciclo de vidaciclo de vida

  • 7/22/2019 Teoria 5.2 - Sesiones

    15/24

    Prof. Laur Fava TTPS 2013

    En el objetoHttpSession sepuedeagregar cualquier tipo deobjeto java, excepto tiposdedatosprimitivos.

    Todo objeto queseagregaaun objeto HttpSession, tieneun nombrenico asociado (unString) quelo identifica.

    Ht t pSessi on sesi on =request.getSession(true);Car r i t oComprascompras = new Car r i t oCompr as( ) ;sesion.setAttribute(carrito, compras);

    Devuelve null si no seasign previamente un

    valor para el tem.

    Si ya existia en la sesin un objeto connombre carrito, lo sobrescribe.

    Para recuperar un objeto de la sesin hay que hacercast ingexplcito a un tipo de datojava.

    Escribir datos en un objeto HttpSession

    Recuperar datos desde un objeto HttpSession

    Ht t pSessi on sesi on= request.getSession(true);Car r i t oComprascompras=(CarritoCompras)sesion.getAttribute(carrito);

    Retorna nu l l si no encuentra en lasesin un objeto con clave carrito

    Guardar y recuperarGuardar y recuperardatos en la sesidatos en la sesinn

  • 7/22/2019 Teoria 5.2 - Sesiones

    16/24

    Prof. Laur Fava TTPS 2013

    Los siguientescdigos pertenecen auna aplicacin web simple, quepermite seleccionar

    librosparacomprar. Loslibrosseleccionadossevan guardando en lasesin del usuario.

  • 7/22/2019 Teoria 5.2 - Sesiones

    17/24

    Prof. Laur Fava TTPS 2013

    package libreria;

    // imports@WebServlet("/ComprarLibros")

    public class ComprarLibros extends HttpServlet {

    pri vat e st at i c f i nal l ong ser i al Versi onUI D = 1L;

    protected void doPost(HttpServletRequest request, HttpServletResponse response)

    throws ServletException, IOException {

    String[] itemsSeleccionados;

    String nombre=null;

    Integer cant_items=null;

    HttpSession sesion = request.getSession(true);Object cant = sesion.getAttribute("cant_items");

    if (cant == null)

    cant_items=0;

    else

    cant_items=(Integer)cant;

    itemsSeleccionados = request.getParameterValues("item");

    if (itemsSeleccionados != null){

    for (int i=0; i

  • 7/22/2019 Teoria 5.2 - Sesiones

    18/24

    Prof. Laur Fava TTPS 2013

    Se el mtodo i sNew( ) retorna truesignifica que no hay sesin creada

    La pginamostrarCompras.jsptoma lositemsguardadosen la sesin y los muestra. Sino hay sesin, redireccioa a la pginacatalogo.jsp

  • 7/22/2019 Teoria 5.2 - Sesiones

    19/24

    Prof. Laur Fava TTPS 2013

    package mi sServl ets;

    import j ava. i o. I OExcept i on;import j ava. i o. Pr i nt Wr i t er ;import j avax. ser vl et . *;import j avax. ser vl et . ht t p. *;

    public classSalirextends Ht t pServl et {

    public void doGet( Ht t pServl etRequest r eq, Ht t pServl etResponse r esp)throws . . . {

    Pri ntWr i t er out =r esp. get Wr i t er ( ) ;r esp. set Cont ent Type( " t ext / ht ml " ) ;out . pr i nt ( "" ) ;out . pr i nt ( "") ;HttpSession ses = req.getSession(false);

    if (ses!=null){

    out.print("Gracias por su compra!!");

    ses.invalidate();

    }

    out . pr i nt ( "") ;out . pr i nt ( "" ) ;out . cl ose( ) ;

    }

    }

    Soporte de sesionesSoporte de sesionesun ejemploun ejemplo

  • 7/22/2019 Teoria 5.2 - Sesiones

    20/24

    Prof. Laur Fava TTPS 2013

    Soporte de sesionesSoporte de sesionesLa interfaceLa interfaceHttpSessionListenerHttpSessionListener

    En la API de Servlets existen listeners relacionados con sesiones. Una clase que implementa la

    interfacejavax.servlet.http.HttpSessionListener es notificada de los cambios quese producen en la lista de sesionesactivasde la aplicacin web. Asociadacon esta interface listenerest la clasejavax.servlet.http.HttpSessionEventque representa el evento ocurrido ypermiteacceder al objeto HttpSession.

    package l i brer i a;i mpor t j avax. ser vl et . *;i mpor t j avax. ser vl et . ht t p. *;

    @WebLi st enerpubl i c cl ass Contador Sesi onesAct i vas i mpl ementsHttpSessionListener{

    st at i c pr i vat e i nt sesi onesAct i vas;

    public static int getSesionesActivas() {

    return sesionesActivas;

    }

    publ i c voi dsessionCreated(HttpSessionEvent arg0) {

    ses i onesAct i vas++;}

    publ i c voi dsessionDestroyed(HttpSessionEvent arg0) {sesi onesAct i vas- - ;

    }}

    Estos mtodos reciben el evento

    Ht t pSess i onEvent a partir del cual sepuederecuperar lasesin.

    Tambin existelainterfacejavax.servlet.http.HttpSessionAttributeListenerquepermitedetectar cuando seagregan, reemplazan o eliminan atributosdelasesin.

  • 7/22/2019 Teoria 5.2 - Sesiones

    21/24

    Prof. Laur Fava TTPS 2013

    Las sesiones mantienen el estado conversacional de los usuarios. El modelo quehemos discutido hasta ahora, es uno en donde toda esta informacin o estadoesten lamemoriadeun servidor web.

    Cmomanejarelestadoenunambientemulti-servidor ?todoslosrequerimientosdelmismousuariovanalmismoservidor:

    balanceo decarga:si toda la informacin de una sesin esttoda en un servidor y se fuerza a que todos requerimientosvayan al mismo servidor, searruinael balanceo.

    respaldodel estado: Qu pasasi el servidor se cae?Si el estadodelasesin estguardado en lamemoriadeun solo Servidor, lainformacin sepierde.

    todoslosservidorescompartenlamismainformacin:

    Estaeslasolucin preferida!!. En este modelo, la informacindela sesin del usuario, esta disponible paracualquier servidorquelanecesite. El estado puedeestar en memoriao en archivos.

    cluster

    cluster

    sesiones

    Soporte de sesionesSoporte de sesionesPersistencia de la sesiPersistencia de la sesinn

    1

    2

  • 7/22/2019 Teoria 5.2 - Sesiones

    22/24

    Prof. Laur Fava TTPS 2013

    Todos los servidores comparten la misma informacin- Losservidoresweb, pueden replicar el estado delasesin en memoria.En general, el servidor querecibeel primer requerimiento, crealasesin(HTTPSession) y la replica al resto de los servidores. El proceso decopiar el estado de una sesin, desde un servidor a otro es llamado

    rplica en memoria. Todos los servidores mantienen actualizados losestadosdelassesiones.- Los servidores tambin podran mantener el estado de las sesionesHTTP usando persistenciabasadaen archivoso JDBC.

    cluster

    sesiones

    Soporte de sesionesSoporte de sesionesPersistencia de la sesiPersistencia de la sesinn

  • 7/22/2019 Teoria 5.2 - Sesiones

    23/24

    Prof. Laur Fava TTPS 2013

    Todos los servidores comparten la misma informacin

    (A) Tenerlasesinreplicadaentodoslosservidoresqueformanelcluster

    Laespecificacin deServlet, defineel elemento , el cual debeincluirseen elweb.xml, para indicar que la aplicacin web puede ser distribuda, a travs demltiplesservidores.

    Para que una sesin pueda persistir entre distintos servidores, se debe cumplir con unrequerimiento: los objetos de alcance sesin deben implementar la interfacejava.io.Serializable. Los contenedores que soportan ambientes multi-server,invocarn los mtodoswriteObject()yreadObject() para guardar y recuperarinformacin de la sesin. Estos mtodos pueden sobrescribirse para poder customizaralgncomportamiento cuando losobjetosson movidosentreservidores(JVMs).

    Implementar la interfacejava.io.Serializableesgeneralmente lo nico quetienequehacer un programador paratener atodoslosobjetosdealcancesesin, distribuidosen un ambientem ult i- servidor.

    Soporte de sesionesSoporte de sesionesPersistencia de la sesiPersistencia de la sesinn

  • 7/22/2019 Teoria 5.2 - Sesiones

    24/24

    Prof. Laur Fava TTPS 2013

    En cuanto a esta solucin hay quetener en cuenta que los accesos a

    base de datos son casi siempre losmdulos que bajan la performancedeunaaplicacin.

    Soporte de sesionesSoporte de sesionesPersistencia de la sesiPersistencia de la sesinn

    Balanceadordecarga

    Servidor web

    Servidor web

    Todos los servidores comparten la misma informacin

    (B) Compartirelestadodelassesionesusandounabasededatos/archivos.Consisteen usar un servidor centralizado paramanejar la informacin delassesiones. Estasolucin le permite a losprogramadores tener un soporte completo sobre la persistenciadel estado. Tambinpodran guardarseen archivos.LaAPI deservletsprovee listenersparaayudar aconstruir labasededatos/archivoscomoHttpSessionListener yHttpSessionAtributeListener que permiten detectarcuando secreao destruyeunasesin y cuando secambian atributosdeunasesin.

    Balanceadordecarga