Download - 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