【发布时间】:2012-01-23 16:39:35
【问题描述】:
我们正在使用 JBoss 7.1、MySQL/PostgreSQL DB、JSF 2.0 和 CDI bean。
我必须通过登录名和密码实现基于数据库的身份验证。我们有一个管理(行政)门户。当客户端在未登录的情况下打开受限页面时,如果客户端未登录,则应将请求重定向到login.*页面。
我尝试使用PhaseListener 来做到这一点。
我可以登录和注销,但是当我尝试打开另一个页面时遇到了问题:
我无法在 PhaseListener 类中获取 @Named("user") public class UserManager bean。我试图通过使用FacesContext 和 EL ... 来获得它,但这一切都没有帮助我。
UserManager 验证登录并将登录的用户存储为current 属性。对于每个请求,如果#{user.current} 不是null,我想检查PhaseListener。但我无法在PhaseListener 中获取#{user} bean。
如何在beforePhase() 或afterPhase() 中获得@Named bean?
更新:这是我目前的尝试:
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;
}
}
【问题讨论】:
-
请显示您在说“我试图通过使用FacesContext,& EL...来获取它,但都没有帮助我”时尝试的代码跨度>
-
我在上面添加了 sn-p - 我尝试在 SessionPhaseListener 中获取 bean
标签: jpa jsf-2 cdi named phaselistener