Java tomcat中的类加载器和安全机制你了解吗
作者:大漠穷秋_ 发布时间:2022-05-11 15:45:02
类加载器
java中的类并不是一次加载完成的,而是按需加载。类加载器是用于加载java类到java虚拟机中的组件,它负责读取java字节码,并转换成 java.lang.Class 的一个实例,使字节码.class文件可以运行。一般类加载器负责根据一个指定的类找到对应的字节码,然后根据这些字节码定义一个java类。另外,它还可以加载资源,包括图像文件和配置文件。
类加载器可以使java类动态地加载到jvm中并运行,即可在程序运行时再加载类,提供了很灵活的动态加载方式。
启动类加载器(Bootstrap ClassLoader):加载对象是java核心库,把一些核心的java类加载进jvm中,这个加载器采用原生代码(c/c++)实现,并不继承java.lang.classLoader,它是所有其他类加载器的最终父类加载器,负责加载<java_home>/jre/lib目录下jvm指定的类库。它属于jvm整体的一部分,jvm一旦启动就将这些指定的类加载到内存中国,避免以后过多的I/O操作,提高系统的运行效率。启动类加载器无法被程序直接使用。
扩展类加载器(Extension ClassLoader):加载对象是java的扩展库,即加载<java_home>/jar/lib/ext目录里的类。这个类是由启动类加载器加载,但因为启动类加载器并非用java实现,已经脱离了java体系,所以如果尝试调用扩展类加载器的getParent()方法获取父类的加载器会得到null。然而,它的父类加载器是启动类加载器。
应用类加载器(application ClassLoader):也叫系统类加载器(system classloader),它负责加载用户类路径自定的类库,如果程序没有自己定义类加载器,就默认使用应用类加载器。它是由启动类加载器加载,但他的父加载类被设置成了扩展类加载器。如果使用这个加载器,通过classloader.getSystemClassLoader()获取。
双亲委派
双亲委派时,会将先委托给父类加载器加载,除非父类加载器没有,才自己加载。
这种模型要求,除了顶层的启动类加载器外,其他的类加载器都要有⾃⼰的⽗类加载器。 假如有⼀个类要加载进来,⼀个类加载器并不会⻢上尝试⾃⼰将其加载,⽽是委派给⽗类加载器,⽗类加载器收到后⼜尝 试委派给其⽗类加载器,以此类推,直到委派给启动类加载器,这样⼀层⼀层往上委派。 只有当⽗类加载器反馈⾃⼰没法完成这个加载时,⼦加载器才会尝试⾃⼰加载。 通过这个机制,保证了 Java 应⽤所使⽤的都是同⼀个版本的 Java 核⼼库的类,同时这个机制也保证了安全性。 设想如果应⽤程序类加载器想要加载⼀个有破坏性的 java.lang.System 类,双亲委派模型会⼀层层向上委派,最终委派给启动类加载器,⽽启动类加载器检查到缓存中已经有了这个类,并不会再加载这个有破坏性的 System 类。
另外,类加载器还拥有全盘负责机制,即当⼀个类加载器加载⼀个类时,这个类所依赖的、 引⽤的其他所有类都由这个类加载器加载,除⾮在程序中显式地指定另外⼀个类加载器加载。
在 Java 中,我们⽤完全匹配类名来标识⼀个类,即⽤包名和类名。 ⽽在 JVM 中,⼀个类由完全匹配类名和⼀个类加载器的实例 ID 作为唯⼀标识。 也就是说,同⼀个虚拟机可以有两个包名、 类名都相同的类,只要它们由两个不同的类加载器加载。 当我们在 Java 中说两个类是否相等时,必须在针对同⼀个类加载器加载的前提下才有意义,否则,就算是同样的字节码,由不同的类加载器加载,这两个类也不是相等的。 这种特征为我们提供了隔离机制,在 Tomcat 服务器中它是⼗分有⽤的。
URLClassLoader
我们在使⽤⾃定义类加载去加载类时,我们需要指明该去哪些资源中进⾏加载,所以JDK提供了URLClassLoader来⽅便我们使⽤,我们在创建URLClassLoader时需要传⼊⼀些URLs,然后在使⽤这个URLClassLoader加载类时就会从这些资源中去加载。
Tomcat中⾃定义的类加载器
Tomcat 拥有不同的⾃定义类加载器,以实现对各种资源库的控制。 ⼀般来说,Tomcat 主要⽤类加载器解决以下 4 个问题。
同⼀个Tomcat中,各个Web应⽤之间各⾃使⽤的Java类库要互相隔离。
同⼀个Tomcat中,各个Web应⽤之间可以提供共享的Java类库。
为了使Tomcat不受Web应⽤的影响,应该使服务器的类库与应⽤程序的类库互相独⽴。
-Tomcat⽀持热部署。
在 Tomcat中,最重要的⼀个类加载器是 Common 类加载器,它的⽗类加载器是应⽤程序类加载器,负责加载 $ CATALINA_ BASE/lib、$CATALINA_HOME/lib 两个⽬录下所有的.class ⽂件与.jar ⽂件。
-Tomcat中⼀般会有多个WebApp类加载器-WebAppClassLoader ,每个类加载器负责加载⼀个 Web 程序。 它的⽗类加载器是Common类加载器。
由于每个 Web 应⽤都有⾃⼰的 WebApp 类加载器,很好地使多个 Web 应⽤程序之间互相隔离且能通过创建新的 WebApp类加载器达到热部署。 这种类加载器结构能有效使 Tomcat 不受 Web 应⽤程序影响,
⽽ Common 类加载器的存在使多个 Web 应⽤程序能够互相共享类库
Tomcat中类加载器架构
源码位置如下,在bootstrap类的初始化过程中,初始了三个类加载:commonLoader,catalinaLoader,sharedLoader
private void initClassLoaders() {
try {
commonLoader = createClassLoader("common", null);
if (commonLoader == null) {
// no config file, default to this loader - we might be in a 'single' env.
commonLoader = this.getClass().getClassLoader();
}
catalinaLoader = createClassLoader("server", commonLoader);
sharedLoader = createClassLoader("shared", commonLoader);
} catch (Throwable t) {
handleThrowable(t);
log.error("Class loader creation threw exception", t);
System.exit(1);
}
}
安全机制
Tomcat中设置了了⼀些安全策略,默认的策略⽂件为conf/catalina.policy
Tomcat中设置了安全策略,规定了Tomcat在运⾏过程中拥有的权限,Tomcat管理者可以修改该权限, 但是Tomcat中有⼀些类是必须能够被访问到的,所有Tomcat中在启动过程中会提前去加载这些类,如果 发现没有对应的权限,那么将会启动失败。
来源:https://blog.csdn.net/Forward__/article/details/120072035


猜你喜欢
- public class PullToLoadListView extends ListView implements OnScrollLi
- Android Support Annotations &
- 最近项目里涉及到自定义View的东西还是挺多的,所以打算在自定义View上多花点时间,也顺便分享给大家。先总结下自定义View的步骤:1、自
- Aop什么是Aop?AOP就是面向切面编程,通过预编译方式以及运行期间的 * 技术来实现程序的统一维护功能。什么是切面,我理解的切面就是两
- 通过一个变量控制线程中断代码:package com.itsoku.chat05;import java.util.concurrent.T
- 前言碎语Disruptor是英国LMAX公司开源的高性能的线程间传递消息的并发框架,和jdk中的BlockingQueue非常类似,但是性能
- 本文实现Unity调用手机摄像,拍摄,然后识别二维码,显示二维码的内容。需要导入一个zxing.unity.dll文件,现在这个脚本的识别数
- 1、WinForm中datagridview增加行号在界面上拖一个控件dataGridView1,在datagridview添加行事件中添加
- 1、synchronized的作用为了避免临界区的竞态条件发生,有多种手段可以达到目的。阻塞式的解决方案:synchronized,Lock
- java Class.getSimpleName() 的用法Usage in android:private static final St
- notification是一种让你的应用程序在没有开启情况下或在后台运行警示用户。它是看不见的程序组件(Broadcast Receiver
- 环境变量这个概念不陌生, 就是操作系统的环境变量。系统变量就是java本身维护的变量。 通过 System.getProperty 的方式获
- MyBatis简介MyBatis 是支持普通 SQL 查询,存储过程和高级映射的优秀持久层框架。 MyBatis 消除了几乎所有的 JDBC
- 本文实例讲述了C#使用foreach语句遍历队列(Queue)的方法。分享给大家供大家参考。具体如下:using System;using
- 在日常工作中,我们有时会需要修改字体的颜色来突出文本重点,让读者更容易抓住文章要点。在今天这篇文章中,我将为大家介绍如何以编程方式,在Wor
- 一 技术发展技术的创新和发展都是为了解决一类问题二 框架设计Spring Framework 6大模块三 Spring AOP详解循环依赖问
- 现在很多app的支付、输入密码功能,都已经开始使用自定义数字键盘,不仅更加方便、其效果着实精致。下面带着大家学习下,如何 * 微信的数字键盘,
- 首先说一下,教科书上的扫描线算法确实是用c++很好实现,而且网上有很多源码,而java实现的基本没有(可能是我没看到),所以肖先生还是打算自
- 继承的概念继承是面向对象编程中的一个概念,它允许一个类(称为子类或派生类)继承另一个类(称为父类或基类)的属性和方法。子类在继承父类的同时也
- 1 前言在前文中,已经讲述了 AOP 的后置处理器使用和方法,在本文中继续分享增强信息相关的源码,这里才是 AOP 的核心代码。2 spri