一尘不染

如何在Tomcat环境中保存名称/值对?

tomcat

我们有一个Servlet,它需要某些变量(例如密码,加密盐等),而不要永久保存在文件系统中。这是我们当前所做的(摘要):

在初始化期间,

  1. Perl脚本将ReadMode设置为2以屏蔽标准输出回显,提示用户输入变量,过滤已知文件以将其放入并调用tomcat / bin / startup.sh

  2. servlet init()方法从文件中读取变量并将其删除(文件)。

问题:重新编译WAR时,tomcat会尝试部署它(我们希望将其部署为autodeploy =
true)。但是数据文件不再存在,因此抛出了FileNotFoundException(正确的是)。

问题:是否有属性或某些HashMap
/表可用于servlet,在手动启动期间可以存储一些变量?这个想法是init()可以在重新部署期间检查数据文件是否不存在。谢谢-MS


阅读 202

收藏
2020-06-16

共1个答案

一尘不染

Tomcat中没有什么可以做您想要的。如果将设置移至tomcat
JNDI树中,则必须将用户名/密码组合输入到server.xml或context.xml文件中。这是您遇到的问题的几种可能的解决方案。

选项1:使用Tomcat侦听器

如果查看tomcat
server.xml文件的顶部,将会看到几个侦听器,这些侦听器是在tomcat启动时执行的Java类。您可以创建自己的tomcat侦听器,该侦听器从文件系统读取密码,删除文件,并以应用可访问的方式存储用户名/密码Comobo。tomcat侦听器与tomcat服务器的生命周期相关联,因此应用程序的自动重新部署不会导致重新加载您的tomcat侦听器类。您的tomcat侦听器的代码必须放入jar并放置在CATALINA_HOME
\ lib文件夹中。

侦听器可以使用静态变量来存储用户名/密码,并具有返回它们的静态方法,这将起作用,因为侦听器将位于tomcat应用程序的父类加载器中。这种方法的缺点是您的应用程序代码取决于tomcat资源侦听器的实现,并且在单元测试中,您可能必须执行一些额外的步骤以确保可以对代码进行单元测试。

侦听器还可以访问tomcat全局JNDI树,并在其中放置用户名和密码组合,然后您的应用程序将必须使context.xml文件使用ResourceLink元素,以使全局jndi条目可用于该应用程序。您还必须做一些额外的工作才能使此方法与单元测试一起使用,因为在JNDI中查找内容通常会使单元测试复杂化。

如果在此项目上使用Spring,最好的选择是在tomcat侦听器中使用静态变量,然后使用自定义spring范围将数据从tomcat侦听器中拉出。这样,您的应用程序就可以保持可测试性,您可以将用户名/密码组合注入需要它们的任何代码中。

选项2:使用Servlet上下文侦听器

在此选项中,您编写了一个上下文侦听器,该侦听器将在应用程序启动和停止时通知您的应用程序。使用这种启动方法,上下文侦听器将运行并读取密码信息并删除文件。如果密码文件在启动时不存在,则上下文侦听器将必须有一种方法让管理员重新生成该文件。

选项3:使用JMX

创建一个JMX MBean,并在JVM
MBeanServer中注册它,然后使用它来存储用户名/密码组合。如果从tomcat侦听器初始化此MBean,则可以让perl脚本远程调用MBean并传递用户名/密码组合。

希望这可以帮助。

2020-06-16