2013-10-10 4 views
1

Я пытаюсь реализовать логин, используя Механизм CDI @javax.enterprise.context.SessionScopedВойти с КДИ, @Produces возвращает кэшированные значения

Код:

@Named 
@SessionScoped 
public class Auth implements Serializable { 

    private User user; 

    @Inject 
    private UserStore userStore; 

    @Produces @CurrentUser 
    public User getUser() { 
    if (user == null) { 
     Principal principal= FacesContext.getCurrentInstance().getExternalContext().getUserPrincipal(); 

      if (principal != null) { 

       Map parameters = new HashMap(); 
       parameters.put("email", principal.getName()); 

       user = (User) userStore.findWithNamedQuery(User.GET_BY_EMAIL, parameters).get(0); 
      } 
     } 

     return user; 
    } 

    public void logout() throws IOException { 
     ExternalContext ec = FacesContext.getCurrentInstance().getExternalContext(); 
     ec.invalidateSession(); 
     ec.redirect(ec.getRequestContextPath() + "/"); 
    } 
} 

Класс, который всегда получает тот же User экземпляр:

@Stateful 
public class NewsService implements Serializable { 

    @Inject @CurrentUser 
    private User currentUser; 

    @Inject 
    private NewsStore newsStore; 

    public List<News> getNewsForLoggedUser(Integer start, Integer limit) { 
     Map<String, Object> params = new HashMap<>(); 
     params.put("user", currentUser); 

     return (List<News>) newsStore.findWithNamedQuery(News.getAllForUser, params, start, limit); 
    } 
} 

проблема есть getUser() способ. Несмотря на то, что сеанс был признан недействительным, он все равно возвращает значение из первого входа. Как я могу уничтожить компонент CDI или изменить его, чтобы он всегда выводил фактическое значение? Я попытался аннотации logout() метода с @PreDestroy, но он производит такую ​​ошибку:

13:20:50,329 ERROR [org.jboss.weld.Bean] (default task-22) WELD-000019 Error destroying an instance Managed Bean [class com.intenso.presentation.Auth] with qualifiers [@Default @Any @Named] of [email protected] 

Я бег на WildFly 8.0.0.Alpha4

+0

Ошибка указывает на то, что боб на самом деле в зависимости объема, см '@ default' части? Вы уверены, что используете правильные аннотации? В противном случае проблема может заключаться в том, что вы используете сборку Alpha. – rdcrng

+0

Убедитесь, что вы НЕ используете javax.faces.bean.SessionScoped. –

+0

Я уверен, я разместил его в первой строке моего сообщения вопроса. – Khozzy

ответ

3

Проблема, вероятно, связана с тем, что ваш производитель не имеет явного объема, поэтому он имеет псевдо-область @Dependent. Это означает, что код производителя вызывается один раз во время сборки EJB и что значение Injected остается неизменным для всей вашей жизни EJB.

Вы не указали, как используется ваш E-mail @Stateful, но я предполагаю, что он введен в другой фрагмент кода, поэтому ваш код будет содержать больше, чем запрос.

Для исправления ошибок ваш должен дать нормальный объем вашему производителю (@RequestScoped кажется лучшим выбором). Таким образом, ваш код производителя станет

@Produces @CurrentUser @RequestScoped 
public User getUser() { ... } 

Помните, что производители не наследуют область действия от компонента, который ее содержит. С этой нормальной областью, bean-фасоль user не будет непосредственно впрыскиваться, но CDI будет вводить прокси-сервер. Таким образом, currentUser останется неизменным только в течение срока действия текущего запроса.

Не стесняйтесь читать dependent scope chapter of the CDI 1.1 spec, это весьма полезно

0

я имел аналогичные вопросы раньше, я чувствую уры сеанса страница кэшируется и вы очистите их , делая это HttpServletResponse httpResponse = (HttpServletResponse) ответ; httpResponse.setHeader («Cache-Control», «no-cache, no-store, must-revalidate»); // HTTP 1.1 httpResponse.setHeader («Pragma», «no-cache»); // HTTP 1.0 httpResponse.setDateHeader («Истекает», 0); // Прокси. chain.doFilter (запрос, ответ); в вашем FilterServlet.

Смежные вопросы