HTTP, CGI, Applets y Servlets Sistemas de Operación II CI-4821 Sep-Dic 2006 Mercedes Martínez Aixbel Martínez Mario Felaco José Luís Castillo Yonathan Ledo 00-33042 01-34114 02-34888 01-33691 01-34033 HTTP Introducción HTTP (HyperText Transfer Protocol) Este protocolo de transferencia es el sistema mediante el cual se envían las peticiones para acceder a una página web así como también las respuestas de la misma. Algunas características del mismo: Es un protocolo sin estado. Esta basado en el modelo Cliente-Servidor. El puerto por defecto mediante el cual realiza las comunicaciones es el 80. Introducción Ejemplo de comunicación en HTTP: Acceder la página www.host.com/index.html: Se abre el socket de comunicación en el puerto 80. Se envía un mensaje como el siguiente: GET /index.html HTTP/1.0 From: [email protected] User-Agent: HTTPTool/1.0 [Línea en blanco] Introducción Ejemplo de comunicación en HTTP: La respuesta del servidor es de la siguiente forma: HTTP/1.0 200 OK Date: Fri, 31 Dec 2003 23:59:59 GMT Content-Type: text/html Content-Length: 1221 <html> <body> <h1>Página principal de tuHost</h1> (Contenido) ... </body> </html> CGI (Common Gateway Interface) CGI Common Gateway Interface Definición Protocolo que proporciona una interfaz o pasarela entre un servidor de información y un proceso externo. Su función principal es la de añadir una mayor interacción a los documentos web que por medio del HTML se presentan de forma estática. Utilizando el protocolo CGI, un cliente web puede especificar un programa, conocido como Script CGI, como objeto web de destino de una petición HTTP. CGI Common Gateway Interface Funcionamiento CGI Common Gateway Interface Ejemplo CGI Common Gateway Interface /cgi-bin Es un directorio especial, que contiene los scripts, configurado dentro del servidor http. El servidor conoce que este directorio contiene ejecutables que deberán ser ejecutados y su salida deberá ser enviada al navegador del cliente. CGI Common Gateway Interface Variables de Entorno CGI CGI utiliza variables de entorno que son escritas por el servidor HTTP para pasar información sobre las peticiones a los programas externos. Algunas de estas variables son: REUQEST_METHOD: tipo de método con el que se ha realizado la petición. QUERY_STRING: contiene la cadena de caracteres codificada. CONTENT_TYPE: el tipo de contenido de los datos. CONTENT_LENGTH: la longitud de la cadena de interrogación en número de bytes. CGI Common Gateway Interface Como se envían los datos Formato de la cadena: nombre1=valor1&nombre2=valor2&nombre3=valor3“ Así que sólo hay que dividir donde están los signos ‘&’ y ‘=’, y luego hacer dos cosas a cada nombre y valor: 1.Convertir todos los signos ‘+’ a espacios. 2.Convertir todas las secuencias ‘%xx’ al valor del carácter cuyo valor ASCII sea ‘xx’ en hexadecimal. Por ejemplo convertir ‘%3d’ a ‘=’. CGI Common Gateway Interface Formas de enviar información Existen dos formas de enviar información, por medio de GET y POST. GET envía la información dentro del URL separando los campos con signos de interrogación '?' antes de la información. POST envía la información directamente al servidor, haciéndolo invisible en el URL CGI Common Gateway Interface Ejemplo GET CGI Common Gateway Interface Ejemplo POST CGI Common Gateway Interface Seguridad en CGI Riesgos Vulnerabilidad Recomendaciones Applets Applets Definición Pequeña aplicación de software que corre dentro del contexto de otro programa. Generalmente tienen funcionalidades limitadas que estan más allá de las del programa en donde corren. Debe correr en un contenedor en el programa anfitrión, a través de un plugin. Applets Diferencias entre applet y script El applet corre en el lado del cliente El applet generalmente posee una interfaz gráfica con el usuario Es compilado, mientras que los script son interpretados Applets Ejemplos de applets Java applets Flash Reproductores de video/sonido (Quicktime, WMP, Real) Java Applets Ventajas Independiente de plataformas Soportado por la mayoría de los browsers Se puede guardar en caché, acelerando el tiempo de carga Permisos limitados predeterminados Con permiso, puede tener acceso a la máquina que lo está corriendo Java Applets Uso //Sección de importaciones public class NombreDelNuevoApplet extends Applet { // Aquí se declaran las variables de estado (public y private) /* Los métodos para la interacción con los objetos se declaran y definen aquí */ public void MetodoUno( parámetros ) { /* Aquí viene para cada método, el código Java que desempeña la tarea. Qué código se use depende del applet */ } } Java Applets Llamadas <APPLET CODE="SuCodigo.class" WIDTH=100 HEIGHT=50> </APPLET> Llama al applet SuCodigo.class y establece su ancho y alto inicial. Cuando se acceda a la página Web donde se encuentre incluida la línea, se ejecutará el byte-code contenido en SuCodigo.class, obteniéndose el resultado de la ejecución del applet en la ventana del navegador, con soporte Java, que se esté utilizando. Java Applets Desventajas Requiere el plugin de Java JVM tiene que correr, aumentando el tiempo de carga Se tiene que bajar de internet Se dificulta diseñar una buena interfaz gráfica Si se “guinda” JRE se lleva el browser y posiblemente el sistema Servlets Servlets Definición Contenedor o motor de Servlets Arquitectura Ciclo de Vida Modelos de subproceso y problemas con Threads Estados de los clientes Ventajas, Desventajas y Seguridad Definición de Servlet Componente Web basado en Java Genera contenido dinámico Opción ante ASP, PHP, Python y JSP (caso particular de servlet). JSR 154 Contenedor o motor de servlets Provee servicios de red para atender las peticiones y respuestas que se envian Debe dar soporte a los protocolos HTTP/1.0, HTTP/1.1 y HTTPS Implementan la interfaz servletContext Arquitectura Implementa la interfaz java.servlet.Servlet o hereda de una clase conveniente para el protocolo deseado, por ejemplo, java.servlet.HttpServlet. Para efectuar la interacción con los clientes recibe dos objetos: Un ServletRequest, que encapsula la comunicación desde el cliente al servidor. Un ServletResponse, que encapsula la comunicación de vuelta desde el servlet hacia el cliente. Arquitectura Ciclo de vida Ciclo de vida Ciclo de vida public ShutdownExample extends HttpServlet { private int serviceCounter = 0; ... protected synchronized void enteringServiceMethod() { serviceCounter++;} protected synchronized void leavingServiceMethod() { serviceCounter--;} protected synchronized int numServices() { return serviceCounter; } } Ciclo de vida protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException } enteringServiceMethod(); try { super.service(req, resp); } finally { leavingServiceMethod(); } { Ciclo de vida ... //Access methods for shuttingDown protected setShuttingDown(Boolean flag){ shuttingDown = flag; } protected Boolean isShuttingDown() { return shuttingDown; } public void destroy() { if (numServices() > 0) { setShuttingDown(true); } while(numServices() > 0) { try { Thread.sleep(interval);} catch (InterruptedException e) { } } } Ciclo de vida public void doPost(...) { ... for(i = 0; ((i < lotsOfStuffToDo) && !isShuttingDown()); i++) { try { partOfLongRunningOperation(i); } catch (InterruptedException e) { } } } Modelos de subproceso. Problemas con Threads. Problemas con las Variables de Instancia en accesos concurrentes. Solución: evitar las variables de instancia y utilizar variables locales definidas dentro del método service(). Otra solución: los servlets pueden cambiar este comportamiento si implementan singleThreadModel. Estados de los clientes 2 mecanismos: Sesiones HTTP mediante la interfaz HttpSession. Cookies. Ventajas y Desventajas Rendimiento y Desempeño: En comparación con los CGI ejecutan con mayor rapidez ya que están basados en el modelo de Threads. Simplicidad y Portabilidad: se ejecutan en como cualquier otra aplicación java en una maquina virtual, en un entorno de servidor controlado y sólo necesita de http básico para comunicarse con los clientes Ventajas y Desventajas Desarrollo: el programador tiene acceso a la tecnología Java y todas sus facilidades. Seguridad Seguridad Declarativa Seguridad Programática: Se apoya en 3 métodos: getRemoteUser isUserInRole getUserPrincipal Roles Seguridad Autentificaciones: Autentificación Básica HTTP. Resumen de Autentificación HTTP. Autentificación de Clientes HTTPS. Autentificación Basada en Formularios.