2021-22
Una aplicación web puede considerarse como una extensión de un servidor de aplicaciones o de un servidor web.
Cliente (navegador)
Protocolo (HTTP/HTTPS)
Servidor (Apache)
¿Qué es un servidor de aplicaciones?
Es un software que ejecuta aplicaciones en un equipo remoto con el objetivo de dar servicio a otras aplicaciones cliente situadas en el equipo del usuario. Los servidores de aplicaciones, además, proporcionan un conjunto de servicios que facilitan el desarrollo de la lógica de negocio.
Arquitectura que permite la implementación de aplicaciones que dan servicio a otras aplicaciones cliente.
Ofrece servicios para separar
Java EE sigue un modelo:
Basado en componentes
Distribuido
Multicapa
Ud´s de Sw que agrupan funciones
Cada componente puede ejecutarse en un sistema diferente. Comunican entre sí.
Cada tipo de componente se aloja en una capa diferente.
Servlets: son clases en Java que reciben peticiones y ofrecen respuestas de forma dinámica. (HTTP)
JavaServer Pages: genera contenido web dinámico (parecido a PHP o ASP.NET).
Se compilan transformándose en un Servlet
Una aplicación web está formada por uno o más componentes web (Servlets, JSP, JSF, etc.), y también, por otros recursos estáticos opcionales: HTML, imágenes, CSS, JavaScript, sonidos, etc.
Una aplicación web Java EE puede desplegarse en un contenedor web usando el formato expandido o empaquetado como WAR.
Directorio Raíz
ejemplo/
Recursos estáticos
index.jsp
images/logo.jpg
css/main.css
js/index.js
Directorios especiales: META-INF y WEB-INF.
No se sirven directamente al cliente como los anteriores. Tienen otro propósito.
WEB-INF contiene
Descriptor de Despliegue (web.xml)
Clases (*.class) dentro de /classes.
Librerias (*.jar) dentro de /lib.
Otros archivos y recursos internos
Todos los archivos privados, al igual que los ficheros .class de los servlets, deberían almacenarse dentro del directorio WEB-INF.
META-INF contiene
Archivos de configuración adicionales (context.xml), confiuración de integración en un ambiente concreto
MANIFEST.MF (info sobre el paquete JAR, usado también en empaquetados WAR).
.
├── index.html
├── index.jsp
├── META-INF
│ └── MANIFEST.MF
└── WEB-INF
├── classes
│ ├── agenda
│ │ ├── Agenda.class
│ │ └── Cita.class
│ └── servlets
│ └── ExportarLista.class
└── web.xml
Estructura completa de ejemplo
Permite empaquetar en una sola unidad aplicaciones web
Java EE completas
WAR: Web Application Archive
jar cf ejemplo.war -C ruta_a_version_expandida .
Alternativas a línea de comandos son IDEs como NetBeans, IntelliJ IDEA, etc. También Maven o Ant
usuario@Ubuntu:~$ jar cf ejemplo.war -C /home/usuario/projects/webapps/ejemplo .
usuario@Ubuntu:~$ jar tf ejemplo.war
META-INF/
META-INF/MANIFEST.MF
index.html
index.jsp
WEB-INF/
WEB-INF/web.xml
WEB-INF/classes/
WEB-INF/classes/servlets/
WEB-INF/classes/servlets/ExportarLista.class
WEB-INF/classes/agenda/
WEB-INF/classes/agenda/Agenda.class
WEB-INF/classes/agenda/Cita.class
documento XML que describe las características de despliegue de una aplicación, un módulo o un componente.
No es obligatorio, pero si se incluye debe ir dentro de
WEB-INF y llamarse web.xml
Apache Tomcat es, a la vez, un servidor HTTP y un contenedor web
Versiones de Tomcat
!Pues manos a la obra!
Ubicación: directorio conf/ o raíz install /etc/tomcat9
Más importante: server.xml
Habitual: Forma dinámica (Server web funcionando)
1. Copiar y configurar manualmente las aplicaciones web (directorio de despliegue indicado en server.xml. Defecto webapps /var/lib/tomcat9)
2. Despliegue Remoto:
a. Usando gestor de aplicaciones web
b. Con Sw específico (Maven o Ant)
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="catalina_access_log" suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
1. Ubicación: Engine, Host, Contexto de app web
2. Atributos: className(obligatorio), directory, prefix, suffix, pattern
%h (hostname), %u (remote user), %t(datetime), ...
/var/lib/tomcat9/logs/catalina_access_log.txt
Sesión: Información que la app web almacena de cada cliente.
Para ello se hace uso de Cookies
1. Ubicación: META-INF/context.xml --> Manager
2. Tipos:
StandardManager (por defecto), PersistentManager (almacena sesiones que aún no han caducado) --> muy útil.
Ejemplo de código de una Sesión persistente
<?xml version="1.0" encoding="UTF-8"?>
<Context>
<Manager className="org.apache.catalina.session.PersistentManager" saveOnRestart="true"
maxActiveSession="3" minIdleSwap="10" maxIdleSwap="60" >
<Store className="org.apache.catalina.session.FileStore"/>
</Manager>
</Context>
Comunicar Apps que escuchen en el puerto 80 (Apache) y el puerto 8080 (Tomcat)
1. Configurar Tomcat para que acepte conexiones AJP
2. Reiniciar Tomcat
<Service name="Catalina">
...
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
...
</Service>
Comunicar Apps que escuchen en el puerto 80 (Apache) y el puerto 8080 (Tomcat)
3. Configurar Servidor Web Apache
4. Habilitar módulo proxy_ajp
sudo a2enmod proxy_ajp
5. Reiniciar Apache
6. Añadir configuración para redirección de peticiones
<VirtualHost *:80>
ServerAdmin webmaster@localhost
DocumentRoot /var/www/html
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
ProxyPass "/ejemplo" "ajp://localhost:8009/ejemplo"
</VirtualHost>
Considerar estas 3 acciones. Son muy importantes
1. No mezclar apps web directamente accesibles desde Tomcat con acceso vía AJP
2. Limitar las IP que acceden a las apps web de Tomcat (que solo acceda el servidor web Apache)
3. Proteger Tomcat con un cortafuegos
Recomendado: META-INF/context.xml
* Remote Address Filter: limita acceso a IP`s
* Remote Host Filter
<Valve className="org.apache.catalina.valves.RemoteAddrValve" deny="127.*">
<Valve className="org.apache.catalina.valves.RemoteAddrValve" allow="192\.168.*">
<Valve className="org.apache.catalina.valves.RemoteHostValve" deny="pc_fp.*">
Instalación: sudo apt-get install tomcat9-admin
Acceso:
Protección mediante usuario y password
Roles de Usuario:
Conf. de Usuarios: /etc/tomcat9/tomcat-users.xml
Limitar el acceso
Conveniente configurar el fichero de contexto del gestor para limitar las direcciones IP que pueden acceder.
Ubicación:
* webapps/manager/META-INF/context.xml (inst. manual)
* /etc/tomcat9/Catalina/localhost (inst. desde repo.)
<Context path="/localhost" docBase="/etc/tomcat9/Catalina" antiResourceLocking="false" privileged="true"> <Valve className="org.apache.catalina.valves.RemoteAddrValve" allow="127\.0\.0\.1|192\.168\.1\.130" /> </Context>
Herramienta para la realización de tareas mecánicas y repetitivas (fase construcción y compilación)
Trabajar sin Ant implica una compilación manual de todos los ficheros .java (sin un control de los que han sido modificados y de los que no), incluir los CLASSPATH relativos adecuados, tener los ficheros .class mezclados con el código fuente, etc.; sin embargo con Ant, en el fondo, no estás más que automatizando tareas, para que, al final, con un solo comando puedas compilar desde cero tu proyecto, ejecutar pruebas, generar la documentación, empaquetar el programa, etc.