【问题标题】:Get Managed Bean from servlet filter (is null) [duplicate]从 servlet 过滤器获取托管 Bean(为空)[重复]
【发布时间】:2015-05-16 09:45:40
【问题描述】:

我看过很多类似我的帖子,但没有一个能帮到我。

这是我的托管 bean,它是 sessionScoped,如果登录正常,它会重定向到索引页面,否则会显示错误

@ManagedBean
@SessionScoped
public class LoginBean implements Serializable  {
/**
 * 
 */
private static final long serialVersionUID = 1L;
private static final String[] users = {"anna:qazwsx","kate:123456"};

private String username;
private String password;

private boolean loggedIn     
public String doLogin() {
    for (String user: users) {
        String dbUsername = user.split(":")[0];
        String dbPassword = user.split(":")[1];

        // Successful login
        if (dbUsername.equals(username) && dbPassword.equals(password)) {
            loggedIn = true;
            return "/tmpl/home/index.xhtml?faces-redirect=true";
        }
    }

    // Set login ERROR
    FacesMessage msg = new FacesMessage("Login error!", "ERROR MSG");
    msg.setSeverity(FacesMessage.SEVERITY_ERROR);
    FacesContext.getCurrentInstance().addMessage(null, msg);

    return "/login/login.xhtml";
 }

 public boolean isLoggedIn() {
    return loggedIn;
 }
}

视图,这里一切正常,调用托管bean的doLogin方法

<h:form id="login-form">
 <h:messages />
 <h:outputText value="Nom d'utilisateur:"/>
 <h:inputText value="#{loginBean.username}" id="username"/>
 <br/>
 <h:outputText value="Mot de passe:"/>
 <h:inputSecret value="#{loginBean.password}" id="password"/>
 <br/>
 <h:commandButton id="button" value="Login" action="#{loginBean.doLogin}" />    
 <br/>
</h:form>

过滤器:如果用户通过身份验证,则 loginBean 不为 null 并且已记录

public class LoginFilter implements Filter {

public void doFilter(ServletRequest request, ServletResponse response,   FilterChain chain) throws IOException, ServletException {      
    HttpSession session = ((HttpServletRequest) request).getSession(false);
    LoginBean loginBean = (session != null) ? (LoginBean) session.getAttribute("loginBean") : null;


    if (loginBean!=null)
        System.out.println(loginBean.getUsername());

    if (loginBean == null || !loginBean.isLoggedIn()) {
        System.out.println("here agai");
        String contextPath = ((HttpServletRequest)request).getContextPath();
        ((HttpServletResponse)response).sendRedirect(contextPath + "/login/login.xhtml");
    }         
    chain.doFilter(request, response);             
  }
}

为什么我的托管 bean (loginBean) 为空?

【问题讨论】:

  • 试试@javax.enterprise.context.SessionScoped
  • @Alexander,实际上恰恰相反。他使用的是JSF ManagedBean注解,所以需要使用javax.faces.bean.SessionScoped
  • 谢谢大家,我没有导入 javax.faces.bean.SessionScoped,我使用的是 javax.enterprise.context.SessionScoped。
  • 哦,对不起-我的错!我在 CDI-Bean 中使用@SessionScoped。对不起,搞砸了!

标签: jsf-2 servlet-filters managed-bean session-scope


【解决方案1】:

您是否确认您使用的是正确的 SessionScoped 注释?

请看这里: JSF login filter, session is null

【讨论】:

  • 实际上更多的是评论,然后是答案。我不久前也问过同样的问题。
  • 谢谢,我没有看到那个帖子,所以我的问题不需要
猜你喜欢
  • 2011-04-24
  • 2013-02-19
  • 2016-05-09
  • 2011-12-14
  • 2012-08-27
  • 1970-01-01
  • 2013-10-19
  • 2012-11-08
  • 1970-01-01
相关资源
最近更新 更多