文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Java tomcat中的类加载器和安全机制你了解吗

2024-04-02 19:55

关注

类加载器

java中的类并不是一次加载完成的,而是按需加载。类加载器是用于加载java类到java虚拟机中的组件,它负责读取java字节码,并转换成 java.lang.Class 的一个实例,使字节码.class文件可以运行。一般类加载器负责根据一个指定的类找到对应的字节码,然后根据这些字节码定义一个java类。另外,它还可以加载资源,包括图像文件和配置文件。

类加载器可以使java类动态地加载到jvm中并运行,即可在程序运行时再加载类,提供了很灵活的动态加载方式。

双亲委派

双亲委派时,会将先委托给父类加载器加载,除非父类加载器没有,才自己加载。

这种模型要求,除了顶层的启动类加载器外,其他的类加载器都要有⾃⼰的⽗类加载器。 假如有⼀个类要加载进来,⼀个类加载器并不会⻢上尝试⾃⼰将其加载,⽽是委派给⽗类加载器,⽗类加载器收到后⼜尝 试委派给其⽗类加载器,以此类推,直到委派给启动类加载器,这样⼀层⼀层往上委派。 只有当⽗类加载器反馈⾃⼰没法完成这个加载时,⼦加载器才会尝试⾃⼰加载。 通过这个机制,保证了 Java 应⽤所使⽤的都是同⼀个版本的 Java 核⼼库的类,同时这个机制也保证了安全性。 设想如果应⽤程序类加载器想要加载⼀个有破坏性的 java.lang.System 类,双亲委派模型会⼀层层向上委派,最终委派给启动类加载器,⽽启动类加载器检查到缓存中已经有了这个类,并不会再加载这个有破坏性的 System 类。

另外,类加载器还拥有全盘负责机制,即当⼀个类加载器加载⼀个类时,这个类所依赖的、 引⽤的其他所有类都由这个类加载器加载,除⾮在程序中显式地指定另外⼀个类加载器加载。

在 Java 中,我们⽤完全匹配类名来标识⼀个类,即⽤包名和类名。 ⽽在 JVM 中,⼀个类由完全匹配类名和⼀个类加载器的实例 ID 作为唯⼀标识。 也就是说,同⼀个虚拟机可以有两个包名、 类名都相同的类,只要它们由两个不同的类加载器加载。 当我们在 Java 中说两个类是否相等时,必须在针对同⼀个类加载器加载的前提下才有意义,否则,就算是同样的字节码,由不同的类加载器加载,这两个类也不是相等的。 这种特征为我们提供了隔离机制,在 Tomcat 服务器中它是⼗分有⽤的。

URLClassLoader

我们在使⽤⾃定义类加载去加载类时,我们需要指明该去哪些资源中进⾏加载,所以JDK提供了URLClassLoader来⽅便我们使⽤,我们在创建URLClassLoader时需要传⼊⼀些URLs,然后在使⽤这个URLClassLoader加载类时就会从这些资源中去加载。

Tomcat中⾃定义的类加载器

Tomcat 拥有不同的⾃定义类加载器,以实现对各种资源库的控制。 ⼀般来说,Tomcat 主要⽤类加载器解决以下 4 个问题。

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

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注编程网的更多内容!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯