Использование CDI-инъекции в сервлете - PullRequest
9 голосов
/ 08 марта 2012

Я пытаюсь @Inject @SessionScoped bean-компонент в Фильтр

@WebFilter("/*")
public class IdentityFilter implements Filter, Serializable {

    @Inject
    private LoginUser loginUser;
...

, где LoginUser равен @SessionScoped

Цель состоит в том, чтобы loginUser представлял зарегистрированноев пользователь для сеанса.

Проблема заключается в том, что я не всегда получаю loginUser из текущего сеанса, я получаю «утечку» между сеансами, поскольку объект LoginUser одного сеанса используется совместно с другимсессия.Очевидно, это нехорошо.

Мне интересно, если это так, потому что объект Filter является одноэлементным или, по крайней мере, повторно используется между запросами и сессиями контейнером (glassfish).(Верно?)

Есть ли лучший способ получить объект LoginUser для текущего сеанса без использования свойства в фильтре?

1 Ответ

9 голосов
/ 12 марта 2012

Моя проблема в том, что в контейнере есть только один экземпляр фильтра, фактически один.Кажется, что CDI вводит первый объект уровня сеанса в Фильтр при первом использовании, а затем Фильтр сохраняет эту ссылку навсегда, даже для других сеансов.

Я нашел это решение, чтобы внедрить объект фабрики (Instance), который я могу использовать для получения экземпляра сеанса при каждом запуске фильтра, т. е.

 @WebFilter("/*")
 public class IdentityFilter implements Filter, Serializable {

      @Inject 
      private Instance<LoginUser> loginUserSource;

И в

 @Override
 public void doFilter(...)
      LoginUser login   = loginUserSource.get();

Это, похоже, решает мою проблему.

Спасибо

...