在前面的章节中,你已经看到了一个简单的加载器实现,该实现用于加载servlet类。本章介绍了Catalina中的标准Web应用程序加载程序,或简称为loader。Servlet容器需要自定义的加载器,不能简单地使用系统的类加载器,因为它不应该信任正在运行的Servlet。如果像我们在前面几章中所做的那样,使用系统的类加载器加载所有的servlet和servlet所需要的其他类,那么一个servlet将能够访问运行中的Java虚拟机(JVM)的CLASSPATH环境变量中所包含的任何类和库,这将是一种安全漏洞。仅允许Servlet从 WEB-INF/classes
目录及其子目录中以及从部署到 WEB-INF/lib
目录中的库中加载类。这就是为什么servlet容器需要自己的加载器。Servlet容器中的每个Web应用程序(上下文)都有其自己的加载器。加载程序使用类加载程序,该类加载程序将某些规则应用于加载类。在Catalina中,加载器由 org.apache.catalina.Loader
接口表示。
Tomcat需要其自己的加载器的另一个原因是,只要修改了 WEB-INF/classes
或 WEB-INF/lib
目录中的类,就支持自动重新加载。Tomcat加载器实现中的类加载器使用一个单独的线程,该线程不断检查Servlet和支持类文件的时间戳。为了支持自动重新加载,类加载器必须实现 org.apache.catalina.loader.Reloader
接口。
本章的第一部分简要回顾了Java中的类加载机制。接下来,它介绍了所有加载程序都必须实现的Loader接口,然后是Reloader接口。在查看了加载器和类加载器的实现之后,本章介绍了一个应用程序,该应用程序演示了如何使用Tomcat的加载器。
本章广泛使用两个术语:存储库(repository)和资源(resources)。存储库是一个由类加载器搜索的地方。术语资源是指类加载器中的DirContext对象,该对象的文档库指向上下文的文档库。
原文 https://juejin.im/post/5eef63aff265da02d13c6a99