Java 是否可以在PhaseListener中捕获ViewExpriedException?

Java 是否可以在PhaseListener中捕获ViewExpriedException?,java,jsf,richfaces,session-timeout,jsf-1.2,Java,Jsf,Richfaces,Session Timeout,Jsf 1.2,出于日志记录的目的,我感兴趣的是检测JSF应用程序中何时发生会话超时 我已经实现了一个PhaseListener,它可以检查用户是否已登录并且其会话是否已处于活动状态。我对afterPhase方法的实施是: varurl\u accepted(在代码中使用)包含一个公共页面列表,用户应该可以访问这些页面以提供登录表单 public void afterPhase(PhaseEvent event) { FacesContext context = event.getFacesConte

出于日志记录的目的,我感兴趣的是检测JSF应用程序中何时发生会话超时

我已经实现了一个PhaseListener,它可以检查用户是否已登录并且其会话是否已处于活动状态。我对afterPhase方法的实施是:

  • varurl\u accepted(在代码中使用)包含一个公共页面列表,用户应该可以访问这些页面以提供登录表单

    public void afterPhase(PhaseEvent event) {
        FacesContext context = event.getFacesContext();
        HttpSession session = (HttpSession) context.getExternalContext().getSession(true);
    
        AuthenticationBean sessionBean = (AuthenticationBean) session.getAttribute("sessionBean");
    
        String url_req = context.getViewRoot().getViewId();
    
        //1. Check if user has a session and is logged in:
        if(((sessionBean == null) || (sessionBean != null && !sessionBean.isLoggedIn())) && !url_accepted.contains(url_req)){
            context.getApplication().getNavigationHandler().handleNavigation(context,null,"auth_error");
            return;
        }
    
    //2. Code continues in order to check if a logged user has permissions to access the requested page(not relevant):        
    }
    
当用户由于会话超时而断开连接时,PhaseListener无法从ExternalContext检索我的sessionBean,并将null分配给sessionBean属性。此时,我无法区分该用户之前是否未登录,或者是否因超时而断开连接

我已经读到,可以使用errorPages来检测ViewExpiredException异常,并将视图重定向到特定页面。但是我不知道是否有可能在我的源代码中管理这个异常

我的问题是:我能否在PhaseListener实现中捕获这个ViewExpiredException,以便处理会话超时


提前感谢。

我在JSF项目中遇到过同样的情况。解决方案是使用筛选器捕获已过期的会话。BalusC(JSF专家)解释了这一点,并给出了一个很好的例子:


另外,不要忘记添加注销方法和会话超时处理程序。

感谢您的参考和建议。我会看看我是否能在我的项目中采用这个BalusC解决方案。如果你有任何问题,只需更新你的帖子并在这里留下评论,这样我就能帮助你。我一直在分析BalusC提出的示例,但我不知道他是如何管理超时注销的。我认为他没有采取任何行动。我在应用程序中遇到的问题已经适用于会话超时,但我需要捕获它发生的时间,以便记录由于此原因而断开连接的用户。如果它已经在BalusC代码中实现,请告诉我,我将深入挖掘代码中的更多细节。