将数据源密码放在context.xml之外

时间:2014-01-26 09:53:19

标签: java

这是我的context.xml -

<Context docBase=“myDB” path="/myDB" reloadable="true">
      <Resource name="jdbc/OracleDS"
          auth="Container"
          type="javax.sql.DataSource"
          factory="org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory"
          driverClassName="oracle.jdbc.driver.OracleDriver"
          url="jdbc:oracle:thin:@test.asia-pacific.com:1546:myTest”
          accessToUnderlyingConnectionAllowed="true"
          maxActive="10" 
          maxIdle="5" 
          maxwait="-1"
          removeAbandoned="true" 
          removeAbandonedTimeout="60"
          logAbandoned="true"/>

出于安全原因,我不想将此用户名和密码添加到此文件中。我有以下Java代码 -

Connection getConnection() {

    Connection con = null;
    DataSource ds = null;
    try {
        if (getJNDIName() != null) {

            Hashtable env = new Hashtable();                
            env.put(Context.SECURITY_PRINCIPAL, "username");
            env.put(javax.naming.Context.SECURITY_CREDENTIALS, "password");
            Context initCtx = new InitialContext(env);
            Context envCtx = (Context) initCtx.lookup("java:comp/env");

            ds = (DataSource) envCtx.lookup(getJNDIName());
            if (ds != null) {
                con = ds.getConnection();
            }
            if (ds == null || con == null) {
                throw new RuntimeException(
                        "DataSource and/or Connection object is null.");
            }

            return con;
        } else if (cd_.con_ != null) {
            return cd_.con_;
        } else {
            return null;
        }
    } catch (Exception e) {
        System.out.println(e.printStackTrace());
    }

    return null;
}

当我启动我的应用程序时,我在日志文件中看到以下错误 -

Caused by: java.sql.SQLException: ORA-01017: invalid username/password; logon denied

at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:445)
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:389)
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:382)
at oracle.jdbc.driver.T4CTTIfun.processError(T4CTTIfun.java:600)
at oracle.jdbc.driver.T4CTTIoauthenticate.processError(T4CTTIoauthenticate.java:445)
at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:450)
at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:192)
at oracle.jdbc.driver.T4CTTIoauthenticate.doOAUTH(T4CTTIoauthenticate.java:380)
at oracle.jdbc.driver.T4CTTIoauthenticate.doOAUTH(T4CTTIoauthenticate.java:760)
at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:401)

如果我将用户名和密码放回context.xml中,它就像魅力一样。我怎么把它放在文件外面。我只想将它放在我的Java类中,因为密码将被加密,而不是在xml中,因为从xml解密密码并不简单,我不想进入它。有人可以建议我如何实现这一目标?请

1 个答案:

答案 0 :(得分:1)

Tomcat 7 context.xml支持占位符。 dochere

Is it possible to use placeholder in context.xml

在我的项目中,我在一个监听器中初始化我的DataSource,它允许程序从outfile或类中读取config选项。