2 回答

TA貢獻1820條經驗 獲得超3個贊
一些提示/評論:
如果與應用程序服務器安全性集成,那么用戶名在任何組件上都可用。EJB 可以通過調用 的注入變體來獲得它,這里是:
getCallerPrincipal()
EJBContext
javax.ejb.SessionContext
@Resource private SessionContext sessionCtx;
Servlet 可以從 中檢索主體。JAX-RS 組件 () 可以從 中檢索它。
HttpServletRequest.getUserPrincipal()
ServiceEJB
javax.ws.rs.core.SecurityContext.getUserPrincipal()
您有什么理由不與應用程序服務器安全性集成嗎?
如果您有充分的理由不與應用程序服務器安全性集成,我會提出解決方案與先前答案的變體。其變體是將應用于所有資源(servlet 過濾器或 JAX-RS)的過濾器中的用戶數據設置為用戶數據,這樣您就不必擔心在多個位置進行設置。
ContainerRequestFilter
如果您只需要用戶 ID 進行日志記錄,我建議您看一下 slf4j 中映射診斷上下文 (MDC) 的概念。有了它,您可以在請求開始時盡早設置用戶 ID,然后使其可用于所有日志記錄語句。

TA貢獻1831條經驗 獲得超9個贊
創建一個請求范圍的 CDI Bean,即 .UserContext
將其注入到兩個 EJB 中。
在設置用戶的ID和讀取它。ServiceEJB
BusinessEJB
添加回答
舉報