原理:修改Tomcat中的ServerInfo.properties版本信息,使用jar命令重新打包即可,比较简单.
jar命令用法:
-c 创建新的归档文件
-t 列出归档目录和文件
-x 解压缩已归档的指定(或所有)文件
-u 更新现有的归档文件
-v 在标准输出中生成详细输出 / 提供更详细输出信息
-f 指定归档文件名 / 为压缩包指定名字
-m 包含指定清单文件中的清单信息
-e 为捆绑到可执行 jar 文件的独立应用程序
一、Tomcat的修改版本.
1、jar包路径位于:lib包下的catalina.jar包.
2、jar uvf catalina.jar org/apache/catalina/util/ServerInfo.properties.
3、重启Tomcat服务即可查看
二、SpringBoot中如何修改.
打包后解压,重新替换jar文件即可,原理同上.
【附录:Tomcat安全加固】
一、Tomcat安全加固.
1.修改默认默认端口
a.修改默认的 8005 管理端口(最好将SHUTDOWN修改为其他字符串)
b.修改默认的 8009 AJP端口(未用到的话,最好关掉——直接注释或删掉)
c.修改默认的 HTTP 端口 8080
2.禁用Tomcat管理页面
a.直接将部署 Tomcat 目录下 webapps 下与业务代码无关的文件夹全部删除;
b.注释$CATALINA_HOME\conf\tomcat-users.xml 中的代码,如下所示:
3.隐藏版本号
进入$CATALINA_HOME\lib 目录中,
依次执行如下命令:
mkdir -p org/apache/catalina/util //创建文件夹,名称不可更改
cd org/apache/catalina/util //进入目录
vim ServerInfo.properties //创建文件,写入内容
server.info=Apache Tomcat //这里编写自定义的版本信息
4.重定向错误页面
编辑$CATALINA_HOME\conf\web.xml 文件,在标签前面添加如下内容:
其中 404.html,500.html 存放在 webapp/manager 下。
5.禁止列出目录功能
这项操作是为了防止在使用不含页面名称直接访问目录时找不到默认主页,会显示出目录下所有文件的风险发生。编辑$CATALINA_HOME\conf\web.xml 中的内容,如下所示:
修改为:
6.使用普通用户启动,创建业务账号启动.
7.关注Tomcat版本发布情况,不定期升级Tomcat版本(小版本)
二、优化并提高Tomcat启动速度.
1. 清理不必要的Web应用
首先我们要做的是删除掉webapps文件夹下不需要的工程,一般是host-manager、example、doc等这些默认的工程,可能还有以前添加的但现在用不着的工程,最好把这些全都删除掉。如果你看过Tomcat的启动日志,可以发现每次启动Tomcat,都会重新布署这些工程。
2. 清理XML配置文件
我们知道Tomcat在启动的时候会解析所有的XML配置文件,但XML解析的代价可不小,因此我们要尽量保持配置文件的简洁,需要解析的东西越少,速度自然就会越快。
3. 清理JAR文件
我们还可以删除所有不需要的JAR文件。JVM的类加载器在加载类时,需要查找每一个JAR文件,去找到所需要的类。如果删除了不需要的JAR文件,查找的速度就会快一些。这里请注意:Web应用中的lib目录下不应该出现Servlet API或者Tomcat自身的JAR,这些JAR由Tomcat负责提供。如果你是使用Maven来构建你的应用,对Servlet API的依赖应该指定为
。
4. 清理其他文件
及时清理日志,删除logs文件夹下不需要的日志文件。同样还有work文件夹下的catalina文件夹,它其实是Tomcat把JSP转换为Class文件的工作目录。有时候我们也许会遇到修改了代码,重启了Tomcat,但是仍没效果,这时候便可以删除掉这个文件夹,Tomcat下次启动的时候会重新生成。
Tomcat的意思是,我扫描了你Web应用下的JAR包,发现JAR包里没有TLD文件。我建议配置一下Tomcat不要去扫描这些JAR包,这样可以提高Tomcat的启动速度,并节省JSP编译时间。
conf/
目录下的context.xml
文件,在这个文件里Context标签下,加上JarScanner和JarScanFilter子标签,像下面这样。conf/
目录下的catalina.properties
文件,在这个文件里的jarsToSkip配置项中,加上你的JAR包。tomcat.util.scan.StandardJarScanFilter.jarsToSkip=xxx.jar
5. 禁止Servlet注解扫描
Servlet 3.0引入了注解Servlet,Tomcat为了支持这个特性,会在Web应用启动时扫描你的类文件,因此如果你没有使用Servlet注解这个功能,可以告诉Tomcat不要去扫描Servlet注解。具体配置方法是,在你的Web应用的web.xml
文件中,设置
元素的属性metadata-complete="true"
,像下面这样。
metadata-complete
的意思是,web.xml
里配置的Servlet是完整的,不需要再去库类中找Servlet的定义。
6. 关闭WebSocket支持
Tomcat会扫描WebSocket注解的API实现,比如@ServerEndpoint
注解的类。我们知道,注解扫描一般是比较慢的,如果不需要使用WebSocket就可以关闭它。具体方法是,找到Tomcat的conf/
目录下的context.xml
文件,给Context标签加一个containerSciFilter的属性,像下面这样。
更进一步,如果你不需要WebSocket这个功能,你可以把Tomcat lib目录下的websocket-api.jar
和tomcat-websocket.jar
这两个JAR文件删除掉,进一步提高性能。
7. 随机数熵源优化
这是一个比较有名的问题。Tomcat 7以上的版本依赖Java的SecureRandom类来生成随机数,比如Session ID。而JVM 默认使用阻塞式熵源(/dev/random
), 在某些情况下就会导致Tomcat启动变慢。当阻塞时间较长时, 你会看到这样一条警告日志:
org.apache.catalina.util.SessionIdGenerator createSecureRandom- INFO: Creation of SecureRandom instance for session ID generation using [SHA1PRNG] took [8152] milliseconds.
我们可以设置JVM的参数:
-Djava.security.egd=file:/dev/./urandom
或者是设置java.security
文件,位于$JAVA_HOME/jre/lib/security
目录之下: securerandom.source=file:/dev/./urandom
这里请你注意,/dev/./urandom
中间有个./
的原因是Oracle JRE中的Bug,Java 8里面的 SecureRandom类已经修正这个Bug。 阻塞式的熵源(/dev/random
)安全性较高, 非阻塞式的熵源(/dev/./urandom
)安全性会低一些,因为如果你对随机数的要求比较高, 可以考虑使用硬件方式生成熵源。
8. 并行启动多个Web应用
Tomcat启动的时候,默认情况下Web应用都是一个一个启动的,等所有Web应用全部启动完成,Tomcat才算启动完毕。如果在一个Tomcat下你有多个Web应用,为了优化启动速度,你可以配置多个应用程序并行启动,可以通过修改server.xml
中Host元素的startStopThreads属性来完成。startStopThreads的值表示你想用多少个线程来启动你的Web应用,如果设成0表示你要并行启动Web应用,像下面这样的配置。