Contenidos Servidores/aplicaciones con/sin Estado Sesiones Web con Servlets Contextos compartidos con Servlets Acceso concurrente desde Servlets Servidores Proxy Cache Servidores Virtuales Servidores Web (II) 1 2 Información del Estado de Sesión ¿Aplicaciones sobre Protocolo HTTP? Algunos protocolos y aplicaciones necesitan que el servidor mantenga información especifica de cada cliente durante la sesión. Por ejemplo en un servicio de transferencia de ficheros: un fichero se transmite en bloques, requiriendo varias intercambios de mensajes para completar la transferencia. Un protocolo necesario seria: El protocolo HTTP es un protocolo petición– respuesta: Client Request 1: /catalog?sessionid=1 Server Reply 1: OK. Client Request 2: /catalog?Add=108 Server Reply 2: “OK. Client Request 3: /showCart Server Reply 3: “OK. Client Request 4: /cashier?VISAnumber=1111 Server Reply 4: “OK. Estado el cliente FTP se rve r Estado en servidor FTP se rve r FTP C l ie nt FTP C li e nt file ID file ID file posit ion file posit ion GET file name file ID send <file ID>, block 0 data from block 0 of file send <file ID>, block 1 data from block 1 of file ... 3 GET file name ready send next block data from block 0 of file send next block data from block 1 of file ... 4 Servidor con estado vs. sin estado Un servidor con estado mantiene información del estado de la sesión para cada cliente. Si hay fallos en la red se complica el mantenimiento de la informacion de estado. Los servidores sin estado son mucho más faciles de implementar que los servidores con estado. Aplicaciones Web con estado Soluciones: Mantener información de estado en aplicación Web (NO en el servidor): Scripts CGI la guarda en ficheros, Servlet en variables,…. Y enviar información sobre sessión hacia/desde cliente. Campo de sesión en petición. Cookies (son más campos en cabecera). FTP se rve r Client Request 1: /catalog?sessionid=1. Server Reply 1: “página productos en venta” Client Request 2: /catalog?Add=108&sessionid=1. Server Reply 2: “OK. Client Request 3: /showCart?sessionid=1. OK, envio 108 Server Reply 3: “OK. Client Request 4: /cashier?VISAnumber=1111&sessionid=1. Server Reply 4: “OK. FTP C lie nt file ID file position GET file name ready send next block data from block 0 of file send next block data from block 1 of file ... data is lost due to network failure OK, cobro 108 client resubmits request client receives data as block 0 of file; the true block 0 is missed. 5 6 Sesiones con HTTPSession (II) Sesiones con HTTPSession (I) Permite almacenar información de estado sobre la sesión de un cliente. Internamente puede utilizar a) cookies, o b) parametro sesión en URL. Si no existe session, la crea. Client Request 1: /catalog. Server Reply 1: “página productos en venta”. + URL con sessionid=1. Class CatalogServlet { doGet(HttpServletRequest req, HttpServletResponse res ) { HttpSession session = req.getSession(); if session.getAttribute(“Cart”)==null) {sc = new ShoppingCart(); session.setAttribute(“Cart”,sc); } out.println(” lista de productos”); } 7 Client Request 1: /catalog. Server Reply 1: “página productos en venta”. + URL con sessionid=1.. Client Request 2: /catalog?Add=108&sessionid=1. Server Reply 2: “OK” Class CatalogServlet { doGet(HttpServletRequest req, HttpServletResponse res ) { HttpSession session = req.getSession(); String bookId = req.getParameter(“Add"); try { ShoppingCart cart = (ShoppingCart) session.getAttribute(“Cart”,sc); cart.add(bookId, book); } out.println(“comprando” +book.GetTitle()); } } 8 Sesiones con HTTPSession (III) Client Request 1: /catalog. Server Reply 1: “página productos en venta”. + URL con sessionid=1.. Client Request 2: /catalog?Add=108&sessionid=1. Server Reply 2: “OK” Client Request 3: /ShowCart&sessionid=1. Server Reply 3: “OK” Class ShowCartServlet { doGet(HttpServletRequest req, HttpServletResponse res ) { HttpSession session = req.getSession(); try { ShoppingCart cart = (ShoppingCart) session.getAttribute(“Cart”,sc); out.println(” El total es “ + cart.getTotal()); } } Variables “compartidas” import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class SubastaBMW extends HttpServlet { import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class SubastasActuales extends HttpServlet { Static int pujaActualBMW = 0; public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { response.setContentType("text/html"); PrintWriter out = response.getWriter(); out.println("<html><head><title>Subastas Actuales </title> </head><body>"); public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { …… pujaActual = Integer.parseInt (request.getParameter("miPuja")); } } import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class SubastaFerari extends HttpServlet { Static int pujaActualFerrari= 0; 9 Servlets: Contexto (I) Contexto: Conjunto de servlets, paginas web y otros recursos que forman una aplicación. Instalados en el mismo directorio del contenedor. BuyServlet SellServlet www.ebay.com/subastas/BuyServlet ListaPujas www.ebay.com/subastas/SellServlet Pueden tener objetos compartidos. ? ? out.println("</body></html>"); } } 10 Servlets: Contexto (II) HelloServlet Se accede por mismo directorio en URL. public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException out.println(“Subasta BMW, puja actual:” +pujaActuaBMWl); out.println(“Subasta Ferrari, puja actual:” +pujaActualFerrari); tablas.html colors.html /Subastas Pueden llamarse entre ellos para componer una página web. 11 public class NewBDServlet extends HttpServlet { Private BookDB bookDB; Public void Init() { bookDB = BookDB.instance(); //BookDB.addBook( new Book()); ServletContext context = getServletContext(); context.setAttribute(“example.bookstore.database“ ,bookDB); } } public class CatalogServlet extends HttpServlet { Public void Init() { ServletContext context = getServletContext(); bookDB = (BookDB)context.getAttribute(“example.bookstore. database“); } } Objetos compartidos por varios servlet dentro de un contexto. Interface ServletContext void setAttribute(String name, Object object) Object getAttribute(String name) NewDBServlet CatalogServlet bookDB Index.html colors.html /bookstore 12 Syncronized en Servlets Multiples Clientes “Concurrentes” < POST /SubastaBMW miPuja=50 t=1. A puja 50E por BMW H1 H2 POST /SubastaBMW miPuja=60 eBay Server t=1. B puja 60E por BMW import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class SubastaBMW extends HttpServlet { import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class SubastaBMW extends HttpServlet { Static int pujaActual = 0; Static int pujaActual = 0; public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { pujaActual = Integer.parseInt (request.getParameter("miPuja")); public synchronized doPost(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { pujaActual = Integer.parseInt (request.getParameter("miPuja")); response.setContentType("text/html"); PrintWriter out = response.getWriter(); out.println("<html><head><title>Gracias! </title></head><body>"); out.println(“Has pujado” +pujaActual); out.println("</body></html>"); } } response.setContentType("text/html"); PrintWriter out = response.getWriter(); out.println("<html><head><title>Gracias!</title> </head><body>"); out.println(“Has pujado” +pujaActual); out.println("</body></html>"); } 13 } Bloque de Código Syncronized import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class SubastaBMW extends HttpServlet { Static int pujaActual = 0; public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { response.setContentType("text/html"); PrintWriter out = response.getWriter(); out.println("<html><head><title>Gracias! </title></head><body>"); synchronized(this) { pujaActual = Integer.parseInt (request.getParameter("miPuja")); out.println(“Has pujado” +pujaActual); } out.println("</body></html>"); } Syncronized crea un MONITOR en cada objeto de esa clase: *Solo un único thread puede acceder a todo el objeto. void Subasta Servlet Monitor Instruction execution order: • Hilo 1 llama doPost, • pujaActual=10, • Hilo 1: “Has Pujado 10!” Hilo 2 llama doPost, • pujaActual=20, • Hilo 2: “Has Pujado 20!” 14 Time Servidor Proxy Cache (I) Si el método es utilizado frecuentemente, Syncronized puede hace que el sistema sea ineficiente (Las threads estan esperando en el monitor para entrar en el método): 1. 2. Servidor Web reenvia petición (1,b), almacena respuesta (1.c) y devuelve respuesta (1.d). Servidor Web encuentra recurso localmente (2.b), y lo devuelve (2.c). Sincronizar un bloque de código. Client 1.a 1.d pujaActual =…. 1.b Proxy server 2.a. 2.b. Monitor Client 1.c. 2.c. Situados en mismo lugar 15 Web server Web server Internet 16 Consistencia de datos en Servidor Proxy Cache Servidor Proxy Cache (II) Ventajas: disminuye tráfico WAN, acceso local es más rápido, a veces. Desventajas: Tasa aciertos (HitRate) < 50% con disco duro 10 Gbytes. Timeout. mensaje a servidor origen If-Modified-Since (2.b) Client 1.a 1.b 1.d 2.b. 1.c. Multiples servicios en un solo hardware. Configurar DNS server y Apache server. In DNS server conf file DNS <VirtualHost *:80> DocumentRoot /www/grid ServerName www.grid.com ErrorLog logs/serverGridlog </VirtualHost> Client GET www.grid.com Client GET www.unavarra.es In apache httpd.conf file NameVirtualHost *:80 www.grid.com 125.12.43.5 server 125.12.43.5 www.unavarra.es www.grid.com 1.c. 2.d. <VirtualHost *:80> DocumentRoot /www/unavarra ServerName www.unavarra.es ErrorLog logs/serverUPNAlog </VirtualHost> 19 Situados en mismo lugar Web server 2.b Web server Internet 1 maquina con 1 IP, 2 servicios con diferente nombre. www.grid.com 125.12.43.5 www.unavarra.es 125.12.43.5 Proxy server 2.c. Client Virtual Hosts 1.b 2.a. Web server 17 1.a 1.d 2.c. Situados en mismo lugar (si FALSE) acceder a Cache, (si TRUE) pedir nueva version a servidor origen. Client Proxy server 2.a. Client Web server (si time<timeout) acceder a Cache, (si time>timeout) acceder a página de servidor origen. Internet 18