SSH+Tomcat运行加密部署的web项目(第一版)

为了这个功能提了不少问题都没能获得解答,最后终于本身搞定了,如今把大致步骤总结下,供你们参考指正linux

分三种状况:
(1)没有配置spring自动扫描
(2)2.5.*版本的spring
(3)3.*版本的springweb

下面的内容只写了3.*spring版本的状况spring

先将class文件加密
而后写个解密的类加载器,继承自webappclassloader(项目须要引入catalina.jar,这个包位于tomcat的lib目录下),并配置到tomcat中去apache

tomcat中类加载器分为多层:tomcat

Bootstrap
      |
   System
      |
   Common
   /     \

Webapp1 Webapp2 ...
添加自定义类加载器的时候只须要继承webappclassloader就行了。
而后将编译好的class文件复制到{$Catalina_home}lib中去,这里要注意,若是包名为A.B,那么要在lib中新建这两个目录,也就是说...libABMywebappclassloader.class
lib包有commonclassloader加载,通常只用于加载Tomcat发布的标准jar包,其余的第三方jar包能够在catalina.properties中配置shared.loader,这里因为偷懒就直接放在lib下了,伪装本身写了个第三方库。app

-----而后配置<context.../>元素
根据官方文档,有多个地方配置。
通常来讲会在项目中的META-INF中添加一个context.xml,里面配置:框架

<context>
<Loader loaderClass="a.b.common.classloader.MyClassLoader" />
</context>

这个配置文件在部署时,会被复制到{$Catalina_home}confCatalinalocalhost中去,并被从新命名为:项目名.xml。webapp

因为使用的项目中配置了加密

<Loader className="org.apache.catalina.loader.VirtualWebappLoader" virtualClasspath="../aaaa/*.jar"/>

来加载第三方库,配置了我自定义加载器后,"../aaaa/*.jar" 这些jar包都没法加载了。
目前个人解决办法是注释掉spa

<!--<Loader className="org.apache.catalina.loader.VirtualWebappLoader" virtualClasspath="../aaaa/*.jar"/>-->
而后在mywebappclassloader中使用addRepository()方法添加jar路径(仓库),代码以下:

File jarDir=new File("E:\\front_tc\\aaaa");
        if(jarDir.isDirectory()){
            File[] jarFiles=jarDir.listFiles(new JarFileNameFilter());
            for(File jarFile:jarFiles){
                try {
                    addRepository(jarFile.toURI().toURL().toString());
                } catch (MalformedURLException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }

PS:
图片描述
出自How Tomcat Works

最后在SSH框架下,因为在spring.xml中配置了自动扫描

<context:component-scan base-package="a.b" />

因此a.b包下的类都会被spring自动加载
而spring自动加载时使用的类是SimpleMetadataReader,因此要改写他用于加载的类SimpleMetadataReader

这个类是spring核心包org.springframework.core-3.0.2.RELEASE.jar中的,咱们不须要解压这个包而后替换SimpleMetadataReader.class这么麻烦,只须要在项目中建一个同名的类便可,部署到tomcat后会覆盖掉spring中的类。
创建org.springframework.core.type.classreading包,而后建一个SimpleMetadataReader类。随便去哪下spring的源码,而后复制过来改一下便可

写在最后:对于要部署在linux的同窗,记得把分隔符换成 System.getProperty("file.separator")。我往开发机上打加密补丁的时候,web.xml老是无端消失,不知道为何

相关文章
相关标签/搜索