我正在使用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。
答案 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?) - 这将适用于您现有的监听器。
希望它有所帮助...