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
添加回答
举报