2008-10-08 184 views
3

我有一個需要訪問遠程數據庫的Java客戶端。它的目標是隱藏用戶的數據庫憑證,而不是在代碼中對任何憑證進行硬編碼。因此,數據庫訪問可能必須位於服務器端。JAVA Swing客戶端,數據訪問遠程數據庫; Ibatis

我被限制使用Ibatis作爲數據抽象框架。除此之外,我還在網絡服務器上運行JBoss,允許我使用數據源。

您將如何設計遠程數據庫訪問和數據序列化/反序列化。你更喜歡通過套接字的某種數據流的Web服務嗎?你怎麼會意識到兩者之一?

回答

3

構建一個服務層,並通過RMI公開它 - 可能作爲EJB3無狀態會話bean,因爲您擁有JBoss,可能是純RMI。除非您有特定需求,否則我不會打擾Web服務。 RMI將爲您提供序列化的案例。

您的服務層需要公開一種方法來使用在啓動Swing應用程序時輸入的憑據對用戶進行身份驗證。所有的數據調用都通過服務層。 Swing應用程序中不存在SQL。

除了隱藏數據庫憑證之外,還有其他一些好處。您不僅可以獲得分層架構,還可以通過在服務器上安裝單個數據源,在所有客戶端之間共享預先準備好的語句,從而提高效率。

0

因此,您希望用戶能夠在不知道憑據的情況下訪問數據庫?您唯一的選擇是服務器端數據庫訪問。不幸的是,沒有辦法在Java中隱藏用戶名和密碼 - 如果你把它放入一個屬性文件並加密它,一個確定的攻擊者仍然可以附加一個調試器並查看代碼中的值。另外,除非通過安全連接連接到數據庫,否則有人可以運行數據包嗅探器(例如tcpdump)並在那裏獲取憑證。

你說你運行的是JBoss服務器,最好的辦法是設置遠程EJB,以便客戶端應用程序不直接訪問數據庫 - 它必須通過EJB方法。 (順便說一下,它不一定是EJB,如果你願意的話,你可以做一些事情,比如Web服務)。關鍵是,您的服務器直接與數據庫進行通信,並且客戶端的唯一訪問權限是通過您在服務器上定義的一組有限的接口。

0

如前所述,您必須連接到處理數據庫連接的服務器。 30分鐘的努力無法有效防止某人破壞您的安全。

如果客戶端在某種程度上是本地連接的,那麼在內部網中,在您的應用服務器上使用EJB可能是最好的選擇......儘管您可能想要無狀態會話bean,但我不一定會打消消息驅動的Bean。

對於更長的距離在交通是來自外部,我會用web服務通過HTTPS

在任何情況下,大多數appservers有機制,揭露他們的EJB的web服務作爲與WSDL;並且大約有一百種實用程序可以從WSDL生成客戶端,以調用Web服務(axis的wsdl2java運行良好)