IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> tomcat中的类加载器和安全机制 -> 正文阅读

[Java知识库]tomcat中的类加载器和安全机制

类加载器

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中在启动过程中会提前去加载这些类,如果 发现没有对应的权限,那么将会启动失败。

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2021-09-06 11:02:26  更:2021-09-06 11:02:52 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 13:18:25-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码