代码之家  ›  专栏  ›  技术社区  ›  Jim

无法在web筛选器中访问会话范围的JSF托管bean

  •  1
  • Jim  · 技术社区  · 10 年前

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

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

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

    下面是带有login-in方法的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
    
    1 回复  |  直到 10 年前
        1
  •  2
  •   Community CDub    7 年前

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

    正如您正在使用的 javax.enterprise.context.SessionScoped 对于 @SessionScoped 这意味着你正在使用 CDI Managed beans ,那么您应该只使用 @已命名 使您的bean CDI得到管理。

    你可以检查 BalusC's answer 有关 @已命名 @管理平均值 注释

    更新:

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

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

    您可以这样使用:

    public class YourFilter { 
    
    @Inject
    UserLogin loginBean;
    
    ...
    
    }