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 UserManager
在PhaseListener
课程中获得bean .我试图通过使用FacesContext
和EL 来获得它,这一切都没有帮助我.
该UserManager
验证的登录名和存储登录用户的current
财产.在每个请求,我想检查PhaseListener
if #{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)
会话范围的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
那里作为方法参数.
归档时间: |
|
查看次数: |
3881 次 |
最近记录: |