![](/img/trans.png)
[英]Is it possible to catch ViewExpriedException in PhaseListener?
[英]handleNavigation not working in PhaseListener
我有一个PhaseListener来控制用户对某些页面的访问,如果用户未登录,则将其重定向到loginpage。
问题是我的方法handleNavigation没有重定向用户。 它运行但不重定向用户。
当用户键入不应具有访问权限的URL时,该方法将运行,但是该页面将打开,而不会重定向到登录页面。
怎么了?
public class AuthorizationListener implements PhaseListener {
public void afterPhase(PhaseEvent event) {
FacesContext facesContext = event.getFacesContext();
String currentPage = facesContext.getViewRoot().getViewId();
boolean isLoginPage = (currentPage.lastIndexOf("login.xhtml") > -1);
if(isLoginPage)
return;
if(currentPage.indexOf("/rws/") != -1)
{
HttpSession session = (HttpSession) facesContext.getExternalContext().getSession(true);
Object currentUser = session.getAttribute("usuario");
if (!isLoginPage && currentUser == null) {
NavigationHandler nh = facesContext.getApplication().getNavigationHandler();
nh.handleNavigation(facesContext, null, "loginPage");
}
}
}
public void beforePhase(PhaseEvent event) {
System.out.println("Hellow World");
}
public PhaseId getPhaseId() {
return PhaseId.RENDER_RESPONSE;
}
}
我的面孔配置
<navigation-rule>
<from-view-id>/*</from-view-id>
<navigation-case>
<from-outcome>loginPage</from-outcome>
<to-view-id>/login.xhtml</to-view-id>
</navigation-case>
</navigation-rule>
<lifecycle>
<phase-listener>br.com.testes.filter.AuthorizationListener</phase-listener>
</lifecycle>
您正在渲染响应的后阶段执行代码。 因此,在JSF渲染并完成响应之后。 到那时,整个HTTP响应已经完成,并已完全发送到Web浏览器。
这是无可挽回的一点。 您的代码太迟了,无法更改响应。
而是在还原视图阶段进行监听。 或者,最好使用servlet过滤器 。 JSF阶段侦听器是一项过于笨拙的工具(它不会在非JSF请求中启动,并且在JSF请求期间最多触发12次)。 servlet过滤器是完成此任务的正确工具。 您可以在此答案中找到一个具体示例: 使用登录过滤器时缺少JSF页面样式 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.