簡體   English   中英

如果我們將SessionScoped bean注入到無狀態bean中,如果沒有HTTP會話該怎么辦?

[英]If we inject a SessionScoped bean into a Stateless bean, what happens if there is no HTTP session?

我們的應用程序由與支持bean和無狀態EJB服務交互的網頁組成,但是還有一個與無狀態EJB服務交互的遠程客戶端。

許多服務查詢數據庫,然后根據當前用戶/調用者過濾結果集(例如,用戶僅有權查看某些記錄類型); 也就是說,他們使用程序安全而不是聲明性安全。

在Web端,我的直覺是將當前登錄的用戶存儲在SessionBean中,但是我希望無狀態EJB服務根據當前登錄的用戶來篩選結果集,以便在遠程客戶端期間也應用該篩選。電話。 我可以將SessionBean注入到無狀態EJB服務中,但是我認為SessionBeans使用HTTP會話,並且由於在遠程客戶端調用期間沒有HTTP會話,因此我看不到它如何工作。

我感覺我的方法是錯誤的,應該從容器中檢索“主體”。 但是,由於我們應用程序的開發生命周期,尚未設置容器管理的安全性,但是我仍然責成現在而不是以后實施負責過濾記錄的業務邏輯。

我密切相關的問題:

  1. 知道遠程客戶端將調用Statelesss EJB時,是否可以將SessionScoped bean注入到Stateless EJB中? 在這種情況下,SessionScoped bean的價值是什么?
  2. 我的后備bean和無狀態EJB服務是否應該從容器中檢索Principal,而不是SessionScoped bean?
    • 如果是,在設置容器管理的安全性之前,如何替換模擬主體來處理業務邏輯?

ps我是Java EE的新手。

技術:

  • Java EE 6
  • GlassFish 3.1.2.2
  • “支持bean”,例如javax.enterprise.context.SessionScoped
  • “無狀態EJB服務”,例如javax.ejb.Stateless
  • “遠程客戶”; 例如,一些非Web客戶端直接調用無狀態Bean(通過EJB / RMI)

更新:

有關“遠程客戶端”的更多詳細信息。 我不確定該如何措辭,因為我是Java EE的新手,但是此“遠程客戶端”將不會通過HTTP。 另一個應用程序(稱為應用程序X)將從客戶端接收XML消息。 我認為他們使用證書對客戶端進行身份驗證。 應用程序X將XML轉換為POJO,並直接調用我的無狀態EJB服務。

在這種情況下,我認為我應該說我不應該將SessionBean注入到Stateless EJB服務中,因為當Application X調用EJB服務時將沒有HTTP會話。我的理解正確嗎?

感謝您的耐心等待。 我知道我對這些事情的無知。

您的問題還不清楚。 您的問題讓我承擔很多責任。 因此,您應該分解問題,並提供有關該問題的更多詳細信息。 首先,您應該提及所使用的Java EE版本。 無論如何,我的詳細信息會根據您的情況進行一些假設。

假設您正在談論以下支持Bean: http : //docs.oracle.com/javaee/5/tutorial/doc/bnaqm.html

“無狀態bean” ==無狀態會話bean: http : //docs.oracle.com/javaee/6/tutorial/doc/gipjg.html#gipin

SessionScoped bean: http : //docs.oracle.com/javaee/6/tutorial/doc/gjbbk.html

“遠程客戶端交互”: http : //docs.oracle.com/javaee/6/tutorial/doc/gipjf.html#girfl

對於主要問題,應牢記將Http會話與有狀態會話Bean分開: 有狀態會話Bean和HTTP會話

因此,如果您嘗試將Http會話與有狀態會話bean耦合在一起,則必須將http會話詳細信息提供到一個區域中,在該區域中http會話和有狀態會話bean都可以訪問數據並保留對其的引用。

這也假定您的遠程EJB服務不會首先創建http會話。 因此,您將沒有對通過遠程EJB的HTTP會話的有效引用。

如果您使用的是基於HTTP的“遠程客戶端交互”,為什么不在第一個請求上創建http會話?

HttpServletRequest.getSession(true)

將確保您將始終獲得有效的會話

如果您正在使用其他一些基於HTTP的框架(例如jax-rs),則也可以選擇在其中獲得http會話。

更新1

知道遠程客戶端將調用Statelesss EJB時,是否可以將SessionScoped bean注入到Stateless EJB中? 在這種情況下,SessionScoped bean的價值是什么?

您可以將支持bean用作EJB中的POJO,但不能用作http會話作用域的bean。 如果從遠程EJB需要它們,則必須先對其進行初始化,然后再使用。 意味着,在遠程EJB調用上沒有任何價值。

我的后備bean和無狀態EJB服務是否應該從容器中檢索Principal,而不是SessionScoped bean?

同樣在這里問題還不是很清楚。 您可以將容器(glassfish)配置為具有手動用戶,角色和領域。 因此,這是您用於安全性的本地模擬,您可以從容器中檢索主體。 http://docs.oracle.com/javaee/6/tutorial/doc/bnbxj.html#bnbxs

獨立地:我建議您閱讀有關Java EE的Oracle教程。 很好 花一些錢,我會推薦Java EE 7 Essentials

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM