【问题标题】:Java EE. Client IP in service. Use EJBContextJava EE。服务中的客户端 IP。使用 EJBContext
【发布时间】:2018-10-05 02:54:12
【问题描述】:

我有一个包含 2 个模块的项目:休息和服务。 我需要服务模块中的客户端 IP,但我只能从请求的 Rest 模块中获取它。 我考虑使用 EJBContext.getContextData() 在其他模块中提供此 IP。

我在休息时创造:

@Provider
@ApplicationScoped
public class MyContainerRequestFilter implements ContainerRequestFilter {

	@Context
	private HttpServletRequest servletRequest;

	@Inject
	private ApplicationService applicationService;

	@Override
	public void filter(ContainerRequestContext requestContext) {
		try {
			applicationService.getEJBContext().getContextData().put("ipAddress", servletRequest.getRemoteAddr());
			applicationService.getEJBContext().getContextData().put("ipHost", servletRequest.getRemoteHost());
		} catch(Exception ingnore) {

		}
	}
}

@LocalBean
@Stateless
public class ApplicationService {

	@Resource
	private EJBContext ejbContext;	

	public EJBContext getEJBContext() {
		return ejbContext;
	}
}

如果我使用

@Resource 私有 EJBContext ejbContext;

在 MyContainerRequestFilter - 然后 ejbContext = null;

所以,在我的例子中

applicationService.getEJBContext().getContextData() - NullPointerException

告诉我怎么了?有什么想法我可以做到吗?

谢谢!

【问题讨论】:

    标签: jakarta-ee ejb


    【解决方案1】:

    您只能在 EJB 调用中使用 EJB 上下文来在 EJB 调用或生命周期方法中传递数据。

    您可以在过滤器中尝试此操作:通常,同步调用由同一线程执行。您可以将过滤器中的 IP 地址存储在 ThreadLocal 中,并在需要时访问它。

    当你这样做时,请参考这篇文章:Stackoverflow: ThreadLocal usage in enterprise applications

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-05-08
      • 2012-07-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多