无法在Web过滤器中访问会话范围的JSF托管bean

时间:2015-02-27 20:19:09

标签: jsf servlet-filters jsf-2.2

我有一个带登录页面的JSF 2.2应用程序我需要控制用户对页面的访问权限,所以我写了一个web过滤器,但问题是当我尝试访问会话作用域的JSF托管bean时它总是返回null。我已经登录并且确保登录正常并且用户设置正确但仍然在我访问bean时它返回null

这是我访问bean的过滤器代码

UserLogin loginBean = (UserLogin) ((HttpServletRequest) request).getSession().getAttribute("userLogin");

这里是方法

中登录的bean代码
@Named(value = "userLogin") @SessionScoped @ManagedBean
public class UserLogin implements Serializable {

  /**
   * Creates a new instance of UserLogin
   */
  public UserLogin() {}
  private static final long serialVersionUID = 1520318172495977648L;
  private User user = null;

  String email, password;

  public String getEmail() {
    return email;
  }

  public void setEmail(String email) {
    this.email = email;
  }



  public String getPassword() {
    return password;
  }

  public void setPassword(String password) {
    this.password = password;
  }

  public User getUser() {
    return user;
  }

  public void setUser(User user) {
    this.user = user;
  }



  public void login() {
    UserHelper userHelper = new UserHelper();
    user = userHelper.Login(email, password);
    if (user != null) {
      FacesMessage msg = new FacesMessage("Successful", "Welcomesss :" + user.getFirstname());
      FacesContext.getCurrentInstance().addMessage(null, msg);
    } else {
      FacesMessage msg = new FacesMessage("Failed", "Wrong Usernames or password.");
      msg.setSeverity(FacesMessage.SEVERITY_ERROR);
      FacesContext.getCurrentInstance().addMessage(null, msg);
    }

  }

}

我写了一个示例代码来检索所有会话attrbuties但我找不到userLogin 这是方法及其输出

 Enumeration attrs = ((HttpServletRequest) request).getSession().getAttributeNames();
 while (attrs.hasMoreElements()) {

   LOG.log(Logger.Level.FATAL, attrs.nextElement());
 }






FATAL: WELD_S #10
FATAL:   com.sun.faces.application.view.activeViewMaps
FATAL:   org.jboss.weld.context.conversation.ConversationIdGenerator
FATAL:   com.sun.faces.renderkit.ServerSideStateHelper.LogicalViewMap
FATAL:   org.jboss.weld.context.ConversationContext.conversations
FATAL:   com.sun.faces.application.view.activeViewContexts
FATAL:   javax.faces.request.charset
FATAL:   org.jboss.weld.context.beanstore.http.LockStore

1 个答案:

答案 0 :(得分:2)

您正在使用@ManagedBean@Named注释,您只能使用其中一个注释。

当您使用javax.enterprise.context.SessionScoped表示您正在使用CDI Managed beans@SessionScoped,那么您应该只使用@Named来管理您的bean CDI。

您可以查看BalusC's answer,了解有关@Named@ManagedBean注释之间差异的更多信息

更新

关于您的评论,您不需要使用:

UserLogin loginBean = (UserLogin) ((HttpServletRequest) request).getSession().getAttribute("userLogin")

您可以像这样使用它:

public class YourFilter { 

@Inject
UserLogin loginBean;

...

}