tomcat的几个常见问题

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/bowei026/article/details/51347760

1、spring被实例化多次,或spring被加载多次,或spring的@Schedule同时执行了多次

其实问题都是spring被tomcat实例化了多次,原因是tomcat的Host下添加了Context节点,如:

<Host name="member.xxx.com" appBase="webapps" unpackWARs="true" autoDeploy="true">
    <Context path="" docBase="member" reloadable="true"></Context>
</Host>

有appBase="webapps",tomcat就会扫描该目录下的所有目录,如果是个工程就会被加载,此时member已经被加载。而Context下又有docBase="member",member又会被加载一次。此时member应用就被加载了两次,此时member.xxx.com和member.xxx.com/member都可以访问证明。

明白了问题现在就来解决,Host有一个deployIgnore属性可以告诉tomcat忽略某些路径,正好适合解决我们这个问题。

<Host name="member.xxx.com" appBase="webapps" deployIgnore="member" unpackWARs="true" autoDeploy="true">
    <Context path="" docBase="member" reloadable="true"></Context>
</Host>

如果有多个Host那么deployIgnore就需要写多个应用目录,而deployIgnore支持正则表达式,deployIgnore="member|sso"即可。

但是member.xxx.com/member就不能访问了,此时需要确保所有的链接都不出现member.xxx.com/member部分,否则界面显示可能会不正确


2、为了同时支持www.xxx.com和xxx.com,是否需要写多个<Host>节点?

不需要,Host下可以有<Alias>节点,如

<Host name="xxx.com" appBase="webapps" ...>
。。。。。。

<Alias">www.xxx.com</Alias>

</Host>


3、监听spring实例化结束

可以用事件ApplicationListener

猜你喜欢

转载自blog.csdn.net/bowei026/article/details/51347760