tomcat安全加载CLASS分析
来源:互联网 发布:linux edonkey 编辑:程序博客网 时间:2024/06/13 03:31
前言
在《通过tomcat源码查看其如何实现应用相互隔离》中,我介绍了在Bootstrap的init方法中,其中有关类加载器的执行有3步:
- 初始化commonLoader、catalinaLoader和sharedLoader;
- 将catalinaLoader设置为Tomcat主线程的线程上下文类加载器;
- 线程安全的加载class。
这篇博客就是介绍如何tomcat线程安全的加载class。
安全加载CLASS分析
首先来看Bootstrap的init方法,见代码清单1
代码清单1 /** * Initialize daemon. */ public void init() throws Exception { // Set Catalina path setCatalinaHome(); setCatalinaBase(); initClassLoaders(); Thread.currentThread().setContextClassLoader(catalinaLoader); SecurityClassLoad.securityClassLoad(catalinaLoader); // Load our startup class and call its process() method if (log.isDebugEnabled()) log.debug("Loading startup class"); Class<?> startupClass = catalinaLoader.loadClass ("org.apache.catalina.startup.Catalina"); Object startupInstance = startupClass.newInstance(); // Set the shared extensions class loader if (log.isDebugEnabled()) log.debug("Setting startup class properties"); String methodName = "setParentClassLoader"; Class<?> paramTypes[] = new Class[1]; paramTypes[0] = Class.forName("java.lang.ClassLoader"); Object paramValues[] = new Object[1]; paramValues[0] = sharedLoader; Method method = startupInstance.getClass().getMethod(methodName, paramTypes); method.invoke(startupInstance, paramValues); catalinaDaemon = startupInstance; }
其中SecurityClassLoad.securityClassLoad(catalinaLoader)的作用就是线程安全的加载class,该方法代码见代码清单2。
代码清单2 public static void securityClassLoad(ClassLoader loader) throws Exception { if( System.getSecurityManager() == null ){ return; } loadCorePackage(loader); loadLoaderPackage(loader); loadSessionPackage(loader); loadUtilPackage(loader); loadJavaxPackage(loader); loadCoyotePackage(loader); loadTomcatPackage(loader); }
securityClassLoad方法主要负责加载Tomcat容器所需的class,包括:
- Tomcat核心class,即org.apache.catalina.core路径下的class;
- org.apache.catalina.loader.WebappClassLoader$PrivilegedFindResourceByName;
- Tomcat有关session的class,即org.apache.catalina.session路径下的class;
- Tomcat工具类的class,即org.apache.catalina.util路径下的class;
- javax.servlet.http.Cookie;
- Tomcat处理请求的class,即org.apache.catalina.connector路径下的class;
- Tomcat其它工具类的class,也是org.apache.catalina.util路径下的class;
以加载Tomcat核心class的loadCorePackage方法为例(见代码清单3),查看其实现。
代码清单3 private final static void loadCorePackage(ClassLoader loader) throws Exception { String basePackage = "org.apache.catalina."; loader.loadClass (basePackage + "core.ApplicationContextFacade$1"); loader.loadClass (basePackage + "core.ApplicationDispatcher$PrivilegedForward"); loader.loadClass (basePackage + "core.ApplicationDispatcher$PrivilegedInclude"); loader.loadClass (basePackage + "core.AsyncContextImpl"); loader.loadClass (basePackage + "core.AsyncContextImpl$AsyncState"); loader.loadClass (basePackage + "core.AsyncContextImpl$DebugException"); loader.loadClass (basePackage + "core.AsyncContextImpl$1"); loader.loadClass (basePackage + "core.AsyncContextImpl$2"); loader.loadClass (basePackage + "core.AsyncListenerWrapper"); loader.loadClass (basePackage + "core.ContainerBase$PrivilegedAddChild"); loader.loadClass (basePackage + "core.DefaultInstanceManager$1"); loader.loadClass (basePackage + "core.DefaultInstanceManager$2"); loader.loadClass (basePackage + "core.DefaultInstanceManager$3"); loader.loadClass (basePackage + "core.DefaultInstanceManager$4"); loader.loadClass (basePackage + "core.DefaultInstanceManager$5"); loader.loadClass (basePackage + "core.ApplicationHttpRequest$AttributeNamesEnumerator"); }
其余的与此类似。这样就将tomcat的class加载进来了
0 0
- tomcat安全加载CLASS分析
- Tomcat的class加载顺序
- Tomcat的class加载顺序
- Dalvik 分析 - Class加载篇
- Dalvik 分析 - Class加载篇
- Dalvik 分析 - Class加载篇
- Dalvik加载Class过程分析
- Tomcat的class加载的优先顺序
- Tomcat的class加载的优先顺序
- 利用Tomcat Plugin动态加载CLASS
- tomcat中class和jar加载顺序
- Tomcat的class加载的优先顺序
- 沙箱安全模型、类加载、class文件校验
- 加载linux kernel 的安全机制分析
- myeclipse 发布 tomcat 应用时候,编译class tomcat能自动加载新编译class的问题
- Tomcat的class加载的优先顺序一览
- Tomcat的class加载的优先顺序一览
- Tomcat的class加载的优先顺序一览
- java设计模式-设配器模式
- CSS3中动画 transform必须要了解的Skew变化原理,css3skew
- KAFKA集群环境搭建
- 脚本是什么
- SparkSQL与Hive on Spark的区别与联系
- tomcat安全加载CLASS分析
- java 创建对象的四种方式、java对象初始化顺序
- 设计模式之原型模式
- argv[], argc参数
- 连续出现次数最多的子串
- linux 内核网络,数据接收流程图
- diyupload插件:批量图片上传
- 关于JCAPTCHA源码的重新编译
- Android自定义控件:动画类(十一)----联合动画的XML实现与使用示例