handleNavigation在PhaseListener中不起作用

时间:2013-04-24 12:25:17

标签: java jsf-2 phaselistener

我有一个PhaseListener来控制用户对某些页面的访问,如果没有登录用户,他会被重定向到loginpage。

问题是我的方法handleNavigation没有重定向用户。 它运行但不重定向用户。

当用户键入不应具有访问权限的网址时,该方法会运行但页面会打开而不会重定向到登录页面。

有什么问题?

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;
}

}

我的faces-config

<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>

1 个答案:

答案 0 :(得分:3)

您在渲染响应的后期执行代码。因此,在JSF呈现并完成响应之后。此时,整个HTTP响应已经完成并完全发送到Web浏览器。

这是一个不归路。为了改变响应,你的代码太迟了。

请改为监听恢复视图阶段。或者,更好的是,使用servlet filter。 JSF阶段监听器对于该作业来说是一个过于笨拙的工具(它不会引发非JSF请求,并且在JSF请求期间最多触发12次)。 servlet过滤器是该作业的正确工具。你可以在这个答案中找到一个具体的例子:JSF page style missing when using login filter