如何在Wildfly上使用远程EJB将有关调用者/客户端的某些信息发送到服务器端?

时间:2019-01-08 22:01:38

标签: java jboss ejb wildfly

我正在使用具有大量Remote EJB服务方法的应用程序,并且我想获得一些有关客户端调用方法的有用信息(除了非常基本的信息,例如IP地址...)。

我发现了这个问题,但是有点过时了:

How can I identify the client or caller of an EJB within the request?

是否存在某种自定义客户端上下文/工作区,可以在其中放置调用方详细信息并在本地线程内部的服务器端接收它们?

除了向每个服务的每个方法中添加参数之外,我是否还有其他选择?

1 个答案:

答案 0 :(得分:1)

启用安全性后,您可以检索当前用户。这很简单,但可能无法满足所有需求。

通常,没有什么可以开箱即用的。添加一些自定义参数可能是最糟糕的选择。

JBoss和Wildfly提供了使用EJB客户端和服务器端容器拦截器的可能性。用法和实现的详细信息取决于您的应用程序服务器的版本。

我通过利用我们的日志记录框架的MDC(映射的诊断上下文)来增强此功能,以使用调用者信息来增强服务器端的日志记录。您可以像使用ThreadLocal这样思考。当然,您需要在客户端保存类似特定信息的调用者上下文之类的东西。全局远程客户端数据(IP地址,...)也可以在客户端拦截器中设置。

我所做的大致概述:

  • 配置客户端和服务器端日志记录以使用其他MDC数据
  • 通过键/值数据增强客户端MDC
  • 客户端拦截器从MDC提取数据并将其放在调用上下文中
  • 服务器端拦截器从调用上下文中提取数据并增强服务器端MDC

此方法有效,但是取决于您的应用程序复杂性(例如,使用server2server调用,在本地异步EJB上的bean2bean调用...),复杂性会增加。不要忘记考虑清理例如您的ThreadLocal数据,以避免可能的内存泄漏。