JSF PhaseListener viewId总是一个落后

时间:2012-01-27 08:31:41

标签: jsf phaselistener

我试图阻止用户使用phaselistener访问特殊页面。因此,我试图弄清楚他们试图访问哪个页面。

但我的问题是,我只得到他们之前的页面。不是实际的页面。

public void afterPhase(PhaseEvent event) 
{
    FacesContext fc = event.getFacesContext();
    System.out.println("test1" + fc.getViewRoot().getViewId());
}

同样在这里

public void afterPhase(PhaseEvent event) 
{
    FacesContext fc = event.getFacesContext();
    HttpServletRequest request = (HttpServletRequest) fc.getExternalContext().getRequest();
    String uri = request.getRequestURI();

    System.out.println("uri: " + uri);
}

为什么会这样,我如何获得用户尝试访问的页面名称?不是那个他们需要一步之前,或者更好的是他们来自的页面。

1 个答案:

答案 0 :(得分:4)

落后一步,因为这是HTTP POST请求的行为方式。当您通过命令按钮在JSF应用程序中导航时,每个请求都作为发布请求发送。

由于您要保护某些资源,请确保通过HTTP GET访问它们,而不是获得确切的视图ID,这可以通过

实现
  • 用户直接点击浏览器地址栏中的网址。
  • 在jsf app发布后,将其重定向到资源而不是简单的JSF导航。 POST-REDIRECT-GET模式看起来像here
  • 如果你在每次POST后显示一些消息,你可能需要Flash映射,这是JSF2中的新功能,如果你在JSF1.x上运气不好,你可以实现flash如果你想

结束捕获HTTP GET请求的视图ID。

希望这会有所帮助......