【问题标题】:Can't Access session scoped JSF managed bean in web filter无法在 Web 过滤器中访问会话范围的 JSF 托管 bean
【发布时间】:2015-04-30 15:59:09
【问题描述】:

我有一个带有登录页面的 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);
    }

  }

}

我编写了一个示例代码来检索所有会话属性,但我找不到 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

【问题讨论】:

  • 你的@SessionScoped 的导入是什么?
  • 我想稍后从过滤器中的会话中获取此 bean 的值。
  • @Ahemd Saad 我明白了,但我问的是 SessionScoped 的导入语句,“import ...”?
  • 导入 javax.enterprise.context.SessionScoped;

标签: jsf servlet-filters jsf-2.2


【解决方案1】:

您同时使用@ManagedBean@Named 注释,您必须只使用其中一个。

由于您将javax.enterprise.context.SessionScoped 用于@SessionScoped,这意味着您正在使用CDI Managed beans,那么您应该只使用@Named 来管理您的bean CDI。

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

更新:

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

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

你可以这样使用它:

public class YourFilter { 

@Inject
UserLogin loginBean;

...

}

【讨论】:

  • 您好 Tarik,我已将我的 bean 更新为 @Named(value = "loginbean") @SessionScoped public class UserLogin implements Serializable {...} 现在在我的过滤器中我使用以下行获取值 UserLogin loginBean = (UserLogin) httpServletRequest.getSession().getAttribute("loginbean");
  • 为什么要使用该行来获取值?如果你想在另一个 Bean 中使用它,你可以使用 @Inject
  • 我在过滤器中使用这一行我正在使用过滤器来检查用户是否经过身份验证。
  • @AhmedSaad 我在答案中添加了一个示例
  • 你真是太棒了!只需更新您的解决方案并删除请求范围....现在它完美无缺!谢谢一吨
猜你喜欢
  • 2013-01-05
  • 2012-12-26
  • 1970-01-01
  • 1970-01-01
  • 2023-03-30
  • 2013-12-13
  • 2014-06-30
  • 2014-07-06
  • 2011-06-08
相关资源
最近更新 更多