2 回答

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

TA貢獻(xiàn)1831條經(jīng)驗(yàn) 獲得超9個贊
創(chuàng)建一個請求范圍的 CDI Bean,即 .UserContext
將其注入到兩個 EJB 中。
在設(shè)置用戶的ID和讀取它。ServiceEJB
BusinessEJB
添加回答
舉報(bào)