1
@Provider
@ServerInterceptor
public class AuthInterceptor implements PreProcessInterceptor {...}

我已经构建了上面的拦截器,它:

  1. 从 HttpServletRequest 的标头字段中检索用户的 ID。
  2. 使用用户 ID 从数据库加载用户实体。
  3. 将来自实体的用户信息(名字/dob/等)存储在 @RequestScoped CDI bean 中。

这样做的原因是让用户信息可用于所有正在进行的 Session bean 调用(使用 @Inject 注释)。

这可行,但是在某些情况下(例如在@Asynchronous 方法调用中),CDI 不注入@RequestScoped bean(而是给出了空引用)。

我也看过使用的例子

InvocationContext.getContextData().put("user-related-data-name", someObj)

但是这似乎不起作用,在将用户数据放入地图后获取用户数据总是返回一个空指针。

在拦截器调用期间添加此用户信息以便在所有后续请求 EJB 调用中都可用的最佳方法是什么?

提前致谢。

4

1 回答 1

0

如果其他人发现相同的问题,这里是我的解决方案的摘要:

我想看看是否有 JavaEE 方法可以做到这一点,但我只是将上下文信息存储在线程本地而不是 Request Scoped bean 中。

当我分叉一个新线程时,我有一个拦截器,它获取当前上下文信息并将其存储在本地的新线程中,因此用户的上下文信息对原始线程和新线程都可用。

请注意,还有一些拦截器会在不再需要它们时清理线程本地的值。

有关线程本地的讨论,请参见此处:何时以及如何使用 ThreadLocal 变量?

于 2013-11-04T23:26:44.900 回答