Jsf模板显示不正确的URL

时间:2013-12-19 10:19:41

标签: jsf servlets jsf-2 richfaces servlet-filters

我正在使用jsf2和RichFaces。我想跟踪用户正在浏览的每个页面。

为此,我创建了Servelet Filter,它拦截了所请求的页面。在我的项目中,我使用jsf模板功能,其中页眉和页脚是固定的。在正文部分,我定义了menu.xhtml和iframe标记。每当用户点击菜单上的任何链接时,响应都会定位到iframe。

我的问题是,我没有得到过滤器中请求的页面的正确URL。

我的过滤器快照

下面显示的是Filter,查找xhtml页面。

chain.doFilter(request, response);

HttpSession session = req.getSession(false);
if( null != session && (uri.contains(".xhtml") || null != session.getAttribute("userid"))){
    if(null != session.getAttribute("userid")){
        String userid = session.getAttribute("userid").toString();
        //for saving usage details 
        if(uri.contains(".xhtml")){                           
            System.out.println(".......Requeted Page.........."+req.getRequestURL().toString());
        saveUserUsage(req);
        }
    }
}
即使选择了菜单中的不同链接,

进入过滤器的网址仍为userdeskop.xhtml。

1 个答案:

答案 0 :(得分:1)

与所点击的菜单无关的同一网址的原因可能是JSF Lifecycle

  • 它决定在服务器端提供哪个页面。

从那一侧,独立于你点击的内容,例如一个JSF Mojarra实现,请求的页面可能总是相同的 - 只是参数不同...并且服务器重定向到所需的页面(这对于过滤器的识别来说太晚了;-))。

更新:我会尝试在 RENDER RESPONSE 阶段之前或之后执行阶段侦听器,因为应该解决导航目标。在监听器内部(未经测试的示例代码)

public void afterPhase(PhaseEvent event)
{
  FacesContext context = event.getFacesContext();
  String viewId = context.getViewRoot().getViewId();
  ....
 }

可能会帮助您解决最终的网址。

如果想要解析主菜单的URL(我猜,这些链接是静态的,并且不需要调用托管bean方法),您也可以使用h:outputLink ,它解析为固定网址(有关详细信息,请参阅When should I use h:outputLink instead of h:commandLink?) - 这将适用于您现有的监听器。

希望它有所帮助...