當前位置:
首頁 > 新聞 > 我們應該了解的JNDI數據源配置

我們應該了解的JNDI數據源配置

一、寫在前面


文章主要介紹了JNDI數據源配置和找回密碼的方法,只嘆範圍太大只能寫下冰山一角,如有錯誤還請指出。


如需了解配置:Tomcat請看2.1,WebLogic請看2.2,WebSphere請看2.3。

如需找回資料庫連接、用戶名和密碼:Tomcat請看2.1,WebLogic請看3.1,WebSphere請看3.2。


二、JNDI數據源


JNDI(Java Naming and Directory Interface,Java命名和目錄介面)是SUN公司提供的一種標準的Java命名系統介面,JNDI提供統一的客戶端API,通過不同的訪問提供者介面JNDI服務供應介面(SPI)的實現,由管理者將JNDI API映射為特定的命名服務和目錄系統,使得Java應用程序可以和這些命名服務和目錄服務之間進行交互。


JNDI數據源則是JNDI常見的應用形式,將數據源交由應用伺服器託管不再由應用程序創建,只需在應用程序中設置正確的JNDI名稱,即可進行數據操作。


三、常見應用伺服器配置


2.1 Tomcat 8.5


Tomcat應是非常常見的Web應用容器,其配置的關鍵點包括文件:context.xml、server.xml、confCatalina{servername}{appname}.xml。({servername}指tomcat中應用的伺服器名稱,{appname}指tomcat中應用的名稱。)

1)根據資料庫類型,在{tomcat}lib下放入對應資料庫的jdbc包,我這裡演示用的是mysql。({tomcat}指tomcat安裝目錄。)



2)

方法一:

配置server.xml和context.xml。在{tomcat}conf下編輯server.xml,在GlobalNamingResources中寫入Resource配置


<Resource    name="jdbc/example"
   auth="Container"
   type="javax.sql.DataSource"
   maxActive="100"
    maxIdle="30"
    maxWait="10000"
   username="root"
    password="root"
   driverClassName="com.mysql.jc.jdbc.Driver"
   url="jdbc:mysql://localhost:3306/test?useUnicode=true&amp;characterEncoding=utf-8&amp;serverTimezone=UTC"/>

3)在context.xml中寫配置,將servers中的配置引用

<ResourceLink name="jdbc/example" global="jdbc/example" type="javax.sql.DataSource"/>

4)那接下來新建一個JavaWeb項目,由三個文件組成:index.jsp,web.xml,ConnExample.java。


index.jsp

<%@page import="jdbc.ConnExample"%>
<%@page import="java.sql.ResultSet"%>
<%@page language="java" contentType="text/html; charset=utf-8"
   pageEncoding="utf-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>JNDI測試頁面</title>
</head>
<body>
<%
   ResultSet resultSet = ConnExample.doSelect();
out.print("<table>");
int colcount = resultSet.getMetaData().getColumnCount();
out.print("<tr><td>ID</td><td>用戶名</td><td>年齡</td></tr>");
while (resultSet.next()) {
   out.print("<tr>");
   for (int i = 1; i <= colcount; i++) {
       out.print("<td>" + resultSet.getString(i) + "</td>");
   }
   out.print("</tr>");
}
out.print("</table>");
%>
</body>
</html>

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xmlns="http://java.sun.com/xml/ns/javaee"
   xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
   id="WebApp_ID" version="3.0">
   <display-name>TMP</display-name>
   <welcome-file-list>
       <welcome-file>index.html</welcome-file>
       <welcome-file>index.htm</welcome-file>
       <welcome-file>index.jsp</welcome-file>
       <welcome-file>default.html</welcome-file>
       <welcome-file>default.htm</welcome-file>
       <welcome-file>default.jsp</welcome-file>
   </welcome-file-list>
   <resource-ref>
       <description>DB Connection</description>
       <res-ref-name>jdbc/example</res-ref-name>
       <res-type>javax.sql.DataSource</res-type>
       <res-auth>Container</res-auth>
   </resource-ref>
</web-app>

ConnExample.java

package jdbc;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;

public class ConnExample {
   public static ResultSet doSelect() throws NamingException, SQLException {
       Context context = new InitialContext();
       DataSource dataSource = (DataSource) context.lookup("java:comp/env/jdbc/example");
       Connection connection = dataSource.getConnection();
       Statement statement = connection.createStatement();
       String sql = "select * from users";
       ResultSet resultSet = statement.executeQuery(sql);
       return resultSet;
   }
}

5)組建項目,打包成war部署一下就好了。



6)

方法二:

當然還有更弱化的,就是直接在context.xml中寫入配置即可。

<Resource    name="jdbc/example"
   auth="Container"
   type="javax.sql.DataSource"
   maxActive="100"
    maxIdle="30"
    maxWait="10000"
   username="root"
   password="root"
   driverClassName="com.mysql.jc.jdbc.Driver"
   url="jdbc:mysql://localhost:3306/test?useUnicode=true&amp;characterEncoding=utf-8&amp;serverTimezone=UTC"/>

7)這樣訪問之前配置的應用即可使用。



8)

方法三:

之前的配置的作用域是全局作用域,只要是tomcat下的應用都可以訪問對應的數據源配置。如果需要針對單個應用配置數據源,可以根據應用項目名稱在目錄{tomcat}confCatalina{servername}下增加配置文件。比如我這個項目叫「JNDIDataSourceExample」,就新增文件JNDIDataSourceExample.xml。

一一對應是必須的,不然找不到配置了。


9)在JNDIDataSourceExample中寫入配置即可。

<?xml version="1.0" encoding="UTF-8"?>
<Context>
<Resource auth="Container" driverClassName="com.mysql.cj.jdbc.Driver" maxActive="100" maxIdle="30" maxWait="10000" name="jdbc/example" password="root" type="javax.sql.DataSource" url="jdbc:mysql://localhost:3306/test?useUnicode=true&amp;characterEncoding=utf-8&amp;serverTimezone=UTC" username="root"/>
</Context>


10)這樣訪問之前配置的應用即可使用。



2.2 WebLogic 12c


WebLogic應是非常常見的Web應用容器,其配置的主要通過WebLogic控制台完成,比tomcat容易的得多。


1)登錄控制台在服務裡面找到數據源,然後新建一條一般數據源。


2)配置數據源名稱,JNDI名稱,資料庫類型。當然這裡需要注意JNDI名稱,這裡是要應用程序的一致的呢,比如:web.xml中配置的JNDI名稱

3)選擇資料庫驅動。這點吧對比WebSphere就能看出,同一體系的好處了,至少驅動有的。


4)後續的一些配置截圖參考,可採用默認設置。當然,資料庫名稱、主機名、埠、資料庫用戶名、口令這個肯定要和需要被連接的資料庫一致。


5)完成之後部署之前的war包即可使用。



2.3 WebSphere 8.5.5.14


WebSphere是非常常見的Web應用容器,其配置的主要通過WebSphere控制台完成,比weblogic複雜太多,以下是建議流程。


1)WebSphere沒有自帶mysql的jdbc,需要自己添加。我這裡先拷貝放到{WebSphere}lib。


2)登錄控制台,首先先配置資源中JDBC的JDBC提供程序,新建一個JDBC提供程序。作用域可任選,不過不能是全部,畢竟全部並不是一個選項,會提示錯誤。


3)配置實現類名,這裡就要到mysql的jdbc包中去找了,找含有名稱DataSource或ConnectionPoolDataSource的類文件。其他的則是描述性質欄位可自便。完整內容截圖看下圖第二張即可。

4)配置類的jar包路徑,之前我放在lib下這裡則圖個方便,依靠環境變數${WAS_INSTALL_ROOT}獲取WebSphere安裝路徑,然後再指向jar包。


5)核對下配置,沒問題就可以完成了。


6)以上是第一個麻煩。接下來配置JDBC中的數據源,點擊新建。作用域可任選。


7)配置數據源名和JNDI名稱,重點是JNDI名稱,需要與應用中引用的一致。



8)選擇剛才設置好的JDBC提供程序。



9)一路默認設置到完成


10)是的我咋沒有配置資料庫連接地址、資料庫用戶名、口令等呢?接下來就是了。進入之前新建的數據源配置。


11)進入J2C認證數據。


12)新建一項


13)別名可自定義,用戶標識和密碼需要填寫為資料庫的用戶名和密碼。


14)確定之後,再次打開剛新建的數據源配置,選擇右側定製屬性。


15)新建一條屬性


16)名稱為「url」,這個是固定的。值則是資料庫地址,java一般是jdbc:mysql://開頭。


17)確定之後返回JNDI數據源配置,保存到主配置。點擊測試連接,只要沒有錯誤就OK,警告可以忽略。



18)完成之後部署之前的war包即可使用。


三、反向思考


以上三種配置,各位看官看還行?Tomcat上應該已經很透徹了,如果是Weblogic和Websphere要是某一天我進入不了控制台,又要找到資料庫的配置,咋辦???還請繼續往下看。


3.1 WebLogic 12c


1)WebLogic當配置好JNDI數據源後,對應的配置會存放到域目錄的configjdbc下。(域目錄由WebLogic由用戶指定,安裝或控制台皆可配置,我安裝的時候直接無腦下一步自然就在這裡了C:OracleMiddlewareOracle_Homeuser_projectsdomainsase_domain)


2)根據WebLogic控制台中配置的名稱,在此處就會保存為對應名稱的配置文件。上面配置案例是」example-jdbc」,所以文件名也就是example-jdbc.xml。打開配置文件查看配置內容,配置中包含資料庫連接、資料庫用戶名、加密後的口令、JNDI名稱。


3)既然是找回密碼,那還需要解密一下密碼才算完結。WebLogic的密碼解密需要兩個條件,一個是加密後的字元串,一個是域目錄下securitySerializedSystemIni.dat文件。具備兩者就可以進行解密了。解密工具地址:https://github.com/NetSPI/WebLogicPasswordDecryptor。(當然解密控制台密碼也是可以的。)



3.2 WebSphere 8.5.5.14


1)WebSphere稍稍麻煩點,大概就像前面配置一樣麻煩。值得回顧一下之前在配置的時候有作用域的選項,不同的作用域配置,會導致資料庫配置保存在不同的位置。慶幸的是文件名是固定的都是resources.xml。



2)無腦下一步安裝後

單元作用域

默認路徑C:Program Files (x86)IBMWebSphereAppServerprofilesAppSrv01configcellsDESKTOP-29LUD0JNode01Cell,這裡面需要注意AppSrv01,DESKTOP-29LUD0JNode01Cell都是可以自由配置無固定形式,但是中間的路徑結構是固定的。(DESKTOP-29LUD0JNode01Cell意思是{SystemHostName}Node01Cell。)


2)再深入

節點作用域

則是在單元作用域路徑的基礎上深入目錄
odesDESKTOP-29LUD0JNode01。(DESKTOP-29LUD0JNode01意思是{SystemHostName}Node01。)


3)再再深入

伺服器作用域

則是在節點作用域的基礎上深入目錄serversserver1。


4)那麼根據配置的作用域打開對應的resources.xml就可以了,然後在文件中搜索我們的jndi名稱。我上面2.3的配置是設置在節點作用域下,故打開節點作用域的resources.xml。這裡離目標更近一步了,我們獲得了authDataAlias和資料庫連接地址,接下來是找到真實的認證信息。



5)authDataAlias的值是保存在單元作用域下的security.xml文件中,打開security.xml搜索我們的別名。userId是資料庫用戶名,password則是資料庫口令。



6)又是一個處理過後的密碼,這裡有個網頁工具可以一試http://strelitzia.net/wasXORdecoder/wasXORdecoder.html,就可以獲得密碼了。



四、總結



1、配置Tomcat需要通過文件編輯實現,而WebLogic和WebSphere提供了網頁控制台配置方式。


2、Tomcat重點關注servers.xml、context.xml和

confCatalina

{servername}{appname}.xml。


3、Weblogic配置藏在configjdbc下,WebSphere分散保存在resources.xml和security.xml中。


4、代碼審計時往往會遇上硬編碼問題,可以將該風險轉嫁規避。


*本文作者:wexiaojiu,轉載請註明來自 FreeBuf.COM



喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 FreeBuf 的精彩文章:

Windows Sandbox:輕量級桌面環境專為安全運行應用程序而設計
ARM彙編之內存損壞:堆棧溢出

TAG:FreeBuf |