資料庫用來連線的帳密, 不想寫死在 source code 裡, 就需要寫在外部檔案中, 寫在實體檔案又怕被 tomcat web server 存取到, 網路上還滿多解法, 也有人是放到 bean 裡.
What is the best practice to deploy database config (username/password) with Java web-app (web.xml)?
https://stackoverflow.com/questions/3762108/what-is-the-best-practice-to-deploy-database-config-username-password-with-jav
比較簡單的作法是, 直接放字串在 tomcat 的 context.xml 中.
You can use an Environment
tag:
https://stackoverflow.com/questions/18404219/how-to-store-string-values-in-context-xml
<Context>
<Environment name="myConnectionURL" value="amqp:5272//blah.example.com&param1=4" type="java.lang.String"/>
</Context>
And you can read it almost as you specified in the question:
InitialContext initialContext = new InitialContext();
Context environmentContext = (Context) initialContext.lookup("java:/comp/env");
String connectionURL = (String) environmentContext.lookup("myConnectionURL");
或是範例 2:
https://stackoverflow.com/questions/47888047/get-database-credentials-from-context-xml-file
This is part of the environment of the container.
/META-INF/context.xml
The context.xml overides the tomcate context entry.
<?xml version="1.0" encoding="UTF-8"?>
<Context>
<!-- Specify a JDBC datasource -->
<Resource name="jdbc/mydatabase"
auth="Container"
type="javax.sql.DataSource"
username="YOUR_USERNAME"
password="YOUR_PASSWORD"
driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://mysql.metawerx.net:3306/YOUR_DATABASE_NAME?autoReconnect=true"
validationQuery="select 1"
maxActive="10"
maxIdle="4"/>
</Context>
source code:
// Get DataSource
Context ctx = new InitialContext();
DataSource ds = (DataSource)ctx.lookup("java:comp/env/jdbc/mydatabase");
// Get Connection and Statement
Connection c = ds.getConnection();
Statement s = c.createStatement();
實際取用 context.xml 裡的設定值,程式碼如下:
InitialContext initContext = null;
try {
initContext = new InitialContext();
dataSource = (DataSource)initContext.lookup("java:comp/env/jdbc/mydatabase");
} catch (NamingException e) {
e.printStackTrace();
}