代码之家  ›  专栏  ›  技术社区  ›  ps0604

将值传递给注入的EJB

  •  0
  • ps0604  · 技术社区  · 5 年前

    ServiceEJB (网络层)和 BusinessEJB 业务ejb 被注入 服务ejb .

    从浏览器接收HTTP请求,调用 ,获取结果并发送HTTP响应。

    也, 有权访问 HttpSession 对象,其中 userId 业务ejb 会话 反对。

    服务ejb 业务ejb 方法,当它记录消息时,必须包含 日志项中会话的。

    自从 没有 用户ID 服务ejb . 问题是,实现这一目标的最佳途径是什么。我不想做的是 每个方法的字段 业务ejb 作为一个参数,有很多 s和 业务ejb 应用程序中的(以及 也会生成日志项),我不想用 字段。相反,我可以 用户ID

    @Produces({MediaType.APPLICATION_JSON})
    @Consumes({MediaType.APPLICATION_JSON})
    @Stateless
    public class ServiceEJB {
    
        @Context
        HttpServletRequest httpRequest;
    
        @Inject
        private BusinessEJB bean;
    
        private String userId;
    
        @Path("someurl")
        public Response someMethod1() {
           final HttpSession session = httpRequest.getSession();
           // get the userId from the session
    
           String s = bean.someMethod2();
    
           // return Response
        }
    }
    
    @Stateless
    public class BusinessEJB {
    
      private String userId;
    
      public String someMethod2() {
         // ....  log an entry with userId
         return "something";
      }   
    }
    
    0 回复  |  直到 5 年前
        1
  •  3
  •   Nikos Paraskevopoulos    5 年前

    一些指针/注释:

    1. 如果与应用程序服务器安全性集成,则用户名可用于任何组件。ejb可以通过调用 getCallerPrincipal() 关于 EJBContext ,这里是 javax.ejb.SessionContext

      @Resource
      private SessionContext sessionCtx;
      

      Servlets可以从 HttpServletRequest.getUserPrincipal() . JAX-RS组件 ServiceEJB javax.ws.rs.core.SecurityContext.getUserPrincipal() .

      有什么理由不与应用服务器安全性集成吗?

    2. 如果您有充分的理由不与应用程序服务器安全性集成,我建议使用 the previous answer . 变化是从应用于所有资源的过滤器(servlet过滤器或JAX-RS)设置用户数据 ContainerRequestFilter

    3. 如果您只需要用户I d来进行日志记录,我建议您看看slf4j中映射诊断上下文(Mapped Diagnostic Contexts,MDC)的概念,有了它,您可以在请求开始时就设置用户ID,然后让它对所有日志记录语句都可用。

        2
  •  2
  •   srnjak    5 年前

    UserContext .

    将其注入两个ejb。

    ServiceEJB 设置用户id和 BusinessEJB