如何使用 Wildfly 上的 Remote EJB 将一些关于 caller/client 的信息发送到服务器端?
How to send some information about caller/client to server side using Remote EJB on Wildfly?
我正在开发一个包含大量远程 EJB 服务方法的应用程序,我希望获得有关调用这些方法的客户端的一些有用信息(除了非常基本的信息,例如 IP 地址.. .).
我发现了这个问题,但它有点过时了:
How can I identify the client or caller of an EJB within the request?
是否有某种自定义客户端上下文/工作区,我可以在其中放置调用者详细信息并在本地线程内的服务器端接收它们?
除了向每个服务的每个方法添加一个参数之外,我还有其他选择吗?
启用安全性后,您可以检索当前用户。这非常简单,但可能无法满足所有需求。
一般来说,没有什么是开箱即用的。添加一些自定义参数可能是最糟糕的选择。
JBoss 和 Wildfly 提供了使用 EJB 客户端和服务器端容器拦截器的可能性。使用和实现细节取决于您的应用程序服务器的版本。
我通过使用我们的日志记录框架的 MDC(映射诊断上下文)来实现这一点,以增强带有调用者信息的服务器端日志记录。您可以将其视为使用 ThreadLocal。当然,您需要在客户端保存特定信息,例如调用者上下文。也可以在客户端拦截器中设置全局远程客户端数据(IP 地址,...)。
我所做的粗略概述:
- 配置客户端和服务器端日志记录以使用额外的 MDC 数据
- 使用 key/value 数据增强客户端 MDC
- 客户端拦截器从 MDC 中提取数据并将其放在调用上下文中
- 服务器端拦截器从调用上下文中提取数据并增强服务器端 MDC
此方法有效,但取决于您的应用程序复杂性(例如,使用 server2server 调用、本地异步 EJB 上的 bean2bean 调用,...)复杂性会增加。不要忘记考虑清理,例如您的 ThreadLocal 数据以避免可能的内存泄漏。
我正在开发一个包含大量远程 EJB 服务方法的应用程序,我希望获得有关调用这些方法的客户端的一些有用信息(除了非常基本的信息,例如 IP 地址.. .).
我发现了这个问题,但它有点过时了:
How can I identify the client or caller of an EJB within the request?
是否有某种自定义客户端上下文/工作区,我可以在其中放置调用者详细信息并在本地线程内的服务器端接收它们?
除了向每个服务的每个方法添加一个参数之外,我还有其他选择吗?
启用安全性后,您可以检索当前用户。这非常简单,但可能无法满足所有需求。
一般来说,没有什么是开箱即用的。添加一些自定义参数可能是最糟糕的选择。
JBoss 和 Wildfly 提供了使用 EJB 客户端和服务器端容器拦截器的可能性。使用和实现细节取决于您的应用程序服务器的版本。
我通过使用我们的日志记录框架的 MDC(映射诊断上下文)来实现这一点,以增强带有调用者信息的服务器端日志记录。您可以将其视为使用 ThreadLocal。当然,您需要在客户端保存特定信息,例如调用者上下文。也可以在客户端拦截器中设置全局远程客户端数据(IP 地址,...)。
我所做的粗略概述:
- 配置客户端和服务器端日志记录以使用额外的 MDC 数据
- 使用 key/value 数据增强客户端 MDC
- 客户端拦截器从 MDC 中提取数据并将其放在调用上下文中
- 服务器端拦截器从调用上下文中提取数据并增强服务器端 MDC
此方法有效,但取决于您的应用程序复杂性(例如,使用 server2server 调用、本地异步 EJB 上的 bean2bean 调用,...)复杂性会增加。不要忘记考虑清理,例如您的 ThreadLocal 数据以避免可能的内存泄漏。