2

我在使用基於EJB 3技術的應用程序時發生了一些問題。如何拆分SFSB Facade?

我想在會話bean中使用Facade模式來將我的客戶端(Web應用程序)與我的Entity Beans分離。

我正在使用SFSB來管理用戶會話。

所以我有一個FacadeLoginRemote遠程接口,它公開到客戶端的方法doLogin()doLogout(),等等 目前這款SFSB還包括一些其他的方法,如getCourse(int id)getResource(int id)。並非所有用戶都可以實際上獲得課程獲取資源,因此Facade在將值返回給客戶端之前執行一些檢查。

我想拆分Facade,把方法getCourse()getResource()放在一個特殊的類中,但是留給FacadeLoginRemote檢查用戶權限的功能。

如果我製作了一些不同的SLSB,我會將它們公開給客戶端。所以客戶可以直接連接到他們,避免從FacadeLoginRemote進行檢查。

我錯了嗎?有沒有辦法做到這一點?

由於提前,

安德烈建議

回答

2

第一個字;如果您正在構建Web應用程序,那麼將Web層和業務層放在同一應用程序中更爲典型。在這種情況下不需要遠程處理。會話bean將在與Web層相同的JVM中運行。

這並不是說沒有任何合法的理由使用遠程接口(有很多),但閱讀你的問題描述在我看來,你可能會更好使用本地bean。

或者是您所說的遠程應用程序的Web應用程序,由他人在他們的服務器上託管的遠程應用程序,並且它們是否從您的EJB Bean中使用服務?

在Java EE中,認證可以在Web模塊中完成。特別是如果您使用本地bean,則此身份驗證(安全主體)將自動傳播到EJB Bean。您可以註釋EJB bean以要求特定的安全角色。如果用戶未通過身份驗證,則她沒有該角色,並且服務將被拒絕。

在這種情況下,如果客戶端嘗試直接連接到具有getCourse()等方法豆子也沒關係。

我很好奇你是如何在EJB中實現doLogin()的。我的猜測是你在那裏做了一些自定義的事情,不幸的是,據我所知,EJB3沒有一種簡單的方法來通過特定的bean的特定方法進行程序化的登錄。安全性主要是聲明性的,在訪問任何bean時,必須由客戶端提供認證細節。例如。當您從遠程JNDI請求bean時,必須提供與遠程服務器的初始JNDI連接的詳細信息。

+0

是的,你是對的網絡和業務層。他們在同一個JVM上工作。我使用遠程接口是因爲我正在考慮開發可能的桌面或移動客戶端應用程序。所以JVM會有所不同。 正如你猜測的那樣,我實現了`doLogin()`來做一些定製認證操作,我的目標是將這個認證傳播到其他bean。 我將檢查有關安全性的EJB註釋。感謝您的回答。 – Andrea 2011-01-10 07:45:32