如何在PhaseListener中访问@Named bean?

AnN*_*Nik 1 jpa named cdi jsf-2 phaselistener

我们使用JBoss 7.1,MySQL/PostgreSQL DB,JSF 2.0和CDI bean.

我必须通过登录名和密码实现基于DB的身份验证.我们有一个管理(管理)门户网站.当客户端在未登录的情况下打开受限页面时,login.*如果客户端未登录,则应将请求重定向到页面.

我试图通过使用a来做到这一点PhaseListener.我可以登录和注销,但是当我尝试打开另一个页面时遇到了一个问题:我无法@Named("user") public class UserManagerPhaseListener课程中获得bean .我试图通过使用FacesContext和EL 来获得它,这一切都没有帮助我.

UserManager验证的登录名和存储登录用户的current财产.在每个请求,我想检查PhaseListenerif #{user.current}是不是null.但我无法得到#{user}豆子PhaseListener.

我怎样才能得到一个@Named在豆beforePhase()afterPhase()


更新:这是我到目前为止的尝试:

private boolean loggedIn( FacesContext context ) throws IOException, ServletException
{
    LOGSTORE.debug( "loggedIn().2 " );

    HttpServletRequest request = (HttpServletRequest) context.getExternalContext().getRequest();
    HttpServletResponse response = (HttpServletResponse) context.getExternalContext().getResponse();

//  ELContext elContext = FacesContext.getCurrentInstance().getELContext();
//  UserManager userManager = (UserManager) FacesContext.getCurrentInstance().getApplication()
//      .getELResolver().getValue( elContext, null, "user" );

    HttpSession session = (HttpSession) context.getExternalContext().getSession( true );
    UserManager userManager = (UserManager) session.getAttribute( "user" );

//  UserManager userManager = (UserManager) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get( "user" );

    if (!StringUtils.contains( ((HttpServletRequest) context.getExternalContext().getRequest())
        .getRequestURL().toString(), URL_SESSION_EXPIRED ))
    {

        if (userManager == null || !userManager.isLoggedIn())
        {
            LOGSTORE.debug( " userManager is " + (userManager == null ? "" : "not ") + " null" );
            if (userManager != null)
            {
                LOGSTORE.debug( " userManager.isLoggedIn() is "
                    + (userManager.isLoggedIn() ? "TRUE" : "FALSE") );
            }
            LOGSTORE.debug( " doPhaseFilter() - START REDIRECT " );
            response.sendRedirect( request.getContextPath() + "/" + homepage + "?auth-failed" );
        }
        return false;

    } else
    {
        LOGSTORE.debug( "loggedIn().3 it is " + homepage );
        return true;
    }
}
Run Code Online (Sandbox Code Playgroud)

Bal*_*usC 7

会话范围的CDI托管bean不会像普通会话范围的JSF托管bean一样存储在HTTP会话中.会话作用域的JSF托管确实存储在会话中,由bean名称作为密钥.然而,会话范围的CDI托管bean通过会话范围中的另一个映射进一步抽象.

您需要通过以编程方式评估EL而不是从会话映射中获取它来获取它.您的EL解析器尝试有一个错误,该值不包含任何#{}表达式.

ELContext elContext = FacesContext.getCurrentInstance().getELContext();
UserManager userManager = (UserManager) FacesContext.getCurrentInstance().getApplication()
    .getELResolver().getValue(elContext, null, "user");
Run Code Online (Sandbox Code Playgroud)

相应修复:

ELContext elContext = FacesContext.getCurrentInstance().getELContext();
UserManager userManager = (UserManager) FacesContext.getCurrentInstance().getApplication()
    .getELResolver().getValue(elContext, null, "#{user}");
Run Code Online (Sandbox Code Playgroud)

顺便说一下,上面的简写是Application#evaluateExpressionGet():

UserManager userManager = context.getApplication()
    .evaluateExpressionGet(context, "#{user}", UserManager.class);
Run Code Online (Sandbox Code Playgroud)

请注意,您已经在FacesContext context那里作为方法参数.