En qué archivo se encuentra el cargador de clases Tomcat 7.0 webappclsaaloaderd
¿A qué se debe esto?
1. Consideraciones de seguridad: si se utiliza el cargador del sistema, el servlet podrá acceder a cualquier clase y biblioteca en el entorno de ruta de clase de la máquina virtual Java, lo que puede causar riesgos de seguridad. El servlet solo puede acceder a clases en el directorio WEB-INF/ y a las bibliotecas de clases implementadas en WEB-INF/lib.
2. El cargador implementa org.apache.catalina.loader. Esto significa que cuando se cambie el servlet, se recargará.
Primero, introduzcamos el cargador de Java
Cada vez que se crea una instancia de una clase Java, primero se debe cargar la clase en la memoria. La Máquina Virtual Java (JVM) utiliza un cargador de clases para cargar esta clase. Si no se encuentra la clase requerida, se lanza una excepción java.lang.ClassNotFoundException. La JVM utiliza tres cargadores de clases: el cargador de clases de arranque, el cargador de clases de extensión y el cargador de clases del sistema.
Estos tres cargadores están en una relación padre-hijo, con el cargador de clases de arranque en la parte superior de la estructura y el cargador de clases del sistema en la parte inferior de la estructura.
1. Cargador de clases de arranque: se utiliza para iniciar la JVM. Una vez que se llama al programa java.exe, el cargador de clases de arranque comienza a funcionar. Por lo tanto, se debe implementar en código nativo y luego las clases requeridas por la JVM se cargan en la función. Además, es responsable de cargar todas las clases principales de Java, como los paquetes java.lang y java.io. Además, el cargador de clases de arranque también busca bibliotecas de clases principales como rt.jar, i18n.jar, etc. basadas en la JVM y el sistema operativo.
2. El cargador de clases de extensión es responsable de cargar clases en el directorio de extensión estándar. Esto hace que escribir programas sea muy simple, simplemente copie el archivo JAR al directorio de extensión y el cargador de clases buscará automáticamente las clases en ese directorio. Diferentes proveedores ofrecen diferentes bibliotecas de extensiones. El directorio de extensión estándar para Sun JVM es /jdk/jre/lib/ext.
3. El cargador del sistema es el cargador predeterminado y buscará clases en la variable de entorno CLASSPATH.
Modelo de autorización
Siempre que es necesario cargar una clase, primero se llama al cargador de clases del sistema. Sin embargo, no carga la clase inmediatamente. En cambio, delega tareas a su clase principal, el cargador de clases de extensión, que a su vez delega tareas a su clase principal, el cargador de clases de arranque. Por lo tanto, el cargador de clases de arranque siempre carga la clase primero. Si el cargador de clases de arranque no puede encontrar la clase requerida, el cargador de clases de extensión intentará cargar la clase. Si el cargador de clases de extensión también falla, el cargador de clases del sistema realizará la tarea. Si el cargador de clases del sistema no puede encontrar la clase, se produce una excepción java.lang.ClassNotFoundException. ¿Por qué necesitamos un modelo de ida y vuelta? El patrón de delegación es muy importante para la seguridad. Se sabe que el acceso a los directorios se puede restringir mediante un administrador de seguridad. Ahora, alguien con intenciones maliciosas puede escribir una clase llamada java.lang.Object que puede usarse para acceder a cualquier directorio del disco duro. Dado que la JVM confía en la clase java.lang.Object, no presta atención a este aspecto de la actividad. Por lo tanto, el administrador de seguridad puede paralizarse fácilmente si se permite cargar un java.lang.Object personalizado. Afortunadamente, esto no sucederá porque el modelo de delegación lo impide. Así es como funciona. Cuando se llama a una clase java.lang.Object personalizada en un programa, el cargador de clases del sistema delega la solicitud al cargador de clases de extensión y luego al cargador de clases de arranque. De esta manera, el cargador de clases de arranque buscará primero en la biblioteca principal, encontrará el java.lang.Object estándar y creará una instancia del mismo. De esta forma, no se cargará la clase java.lang.Object personalizada.
Tomcat se ha ampliado sobre esta base
1. Estableció ciertas reglas específicas para el cargador de clases
2 Almacenamiento en caché de clases previamente cargadas
3. Precargue las clases y prepárelas para su uso
Interfaz del cargador
El cargador de clases Tomcat representa el cargador de aplicaciones web, no el cargador de clases. Los cargadores deben implementar la interfaz org.apache.catalina.Loader. La implementación del cargador utiliza un cargador de clases personalizado org.apache.catalina.loader.WebappClassLoader. Puede obtener el cargador de red ClassLoader utilizando el método getClassLoader de la interfaz Loader.
Vale la pena señalar que la interfaz Loader define un conjunto de métodos para manejar bibliotecas. Los directorios WEB-INF/classes y WEB-INF/lib de aplicaciones de red se agregan como bibliotecas. se usa la interfaz Loader para agregar bibliotecas, el método findRepositories se usa para devolver una cola de todas las bibliotecas.
Los cargadores Tomcat generalmente están asociados con un contexto, y los métodos getContainer y setContainer de la interfaz del cargador establecen esta asociación. El cargador también puede admitir la recarga si se modifican una o más clases en el contexto. La nueva clase se recargará sin reiniciar Tomcat para cargarla. Para lograr propósitos de sobrecarga, la interfaz del cargador proporciona métodos de modificación. En la implementación de un cargador, el método modificar debe devolver verdadero si una o más clases en su biblioteca han sido modificadas y, por lo tanto, es necesario volver a cargarlas. El cargador se recarga solo en lugar de llamar a los métodos sobrecargados de la interfaz de contexto. Se utilizan otros dos métodos, setReloadable y getReloadable, para determinar si el cargador se puede recargar. De forma predeterminada, el mecanismo de recarga no está habilitado. Por lo tanto, para habilitar el mecanismo de recarga para un contexto, debe agregar el siguiente elemento en el archivo server.xml:
WebappLoader
La clase org.apache.catalina.loader.WebappLoader es una implementación de la interfaz Loader. Representa un cargador de aplicaciones web y es responsable. para cargar clases en la Web en la aplicación. WebappLoader crea una instancia de la clase org.apache.Catalina.loader.WebappClassLoader como su cargador de clases. Al igual que otros componentes de Catalina, WebappLoader implementa la interfaz org.apache.catalina.Lifecycle, que está relacionada con el inicio y la parada de contenedores. La clase WebappLoader también implementa la interfaz java.lang.Runnable, por lo que el método de modificación se puede llamar repetidamente y, si el método de modificación devuelve verdadero, la instancia de WebappLoader notifica a su contenedor asociado. Esta clase se sobrecarga a sí misma a través del contexto en lugar de WebappLoader.
Cuando se llama al método de inicio de la clase WebappLoader, realiza las siguientes tareas importantes:
1. Crear un cargador de clases
2. biblioteca
3. Establecer classpath
4. Establecer permisos de acceso
5. Iniciar un nuevo hilo para la recarga automática
Habilitar la recarga automática. hilo
WebappLoader admite la recarga automática, por lo que si los directorios WEB-INF/classes o WEB-INF/lib se han recompilado, estas clases deben recargarse automáticamente sin reiniciar Tomcat. Para lograr esto, WebappLoader tiene un hilo separado que verifica la marca de tiempo de origen cada x segundos. El valor de x está definido por la variable checkInterval, con un valor predeterminado de 15, lo que significa que se realiza una verificación cada 15 segundos para determinar si se requiere recarga automática. Esta clase también proporciona dos métodos, getCheckInterval y setCheckInterval, para acceder o configurar el valor de checkInterval.
WebappClassLoader
La clase org.apache.catalina.loader.WebappClassLoader representa el cargador utilizado en aplicaciones web. La clase URLClassLoader, utilizada en capítulos anteriores para cargar clases Java.
WebappClassLoader está lo más optimizado y seguro posible. Por ejemplo, WebappClassLoader almacena en caché las clases cargadas previamente para mejorar el rendimiento, y la próxima vez que recibe una solicitud para una clase que no se encontró la primera vez, WebappClassLoader simplemente genera una excepción ClassNotFound.
Por motivos de seguridad, la clase WebappClassLoader no permite cargar determinadas clases. Estas clases se almacenan en una matriz de tipo cadena, que ahora tiene un solo miembro.