Given that Tomcat’s Context XML file tends to contain sensitive information (often including credentials needed to connect to a Database), how can I dynamically load these values from a source other than the plain-text context.xml?
Given that Tomcat’s Context XML file tends to contain sensitive information (often including credentials
Share
Say you have a tomcat/conf/context.xml file that looks something like this:
What we want to replace in this case is anything in the ${.*} stuff in this resource definition. With slight modification to the code below, however, you can perform these substitutions on pretty much whatever criteria you’d like.
Notice the line
factory="com.mycompany.util.configuration.CustomDataSourceFactory"What this means is that Tomcat will attempt to use this factory to process this resource. It should be mentioned that this means that this factory will have to be on Tomcat’s classpath on startup (Personally, I put mine in a JAR in the Tomcat
libdirectory).Here is what my factory looks like:
Then, once this code is on the classpath, restart Tomcat and watch catalina.out for the log messages. NOTE: The
System.out.printlnstatements will likely end up printing sensitive information to your logs, so you may want to remove them once you are done debugging.On a sidenote, I wrote this out because I found that many examples were too specific to one specific topic (such as utilizing cryptography), and I wanted to show how this can be done generically. Furthermore, some of the other answers to this question don’t explain themselves very well, and I had to do some digging to figure out what needed to be done to make this work. I wanted to share my findings with you guys. Please feel free to comment on this, asking any questions, or making corrections if you find problems, and I’ll be sure to roll the fixes into my answer.