Jsf 通过PrimeP:idleMonitor超时

Jsf 通过PrimeP:idleMonitor超时,jsf,primefaces,idle-timer,Jsf,Primefaces,Idle Timer,我试图通过primefaces组件处理会话超时 我这样做是因为我需要让用户知道,由于不活动,会话已过期。我需要通过对话框显示此消息,在他关闭对话框后,应将其重定向到登录页面。他不应该在什么都没有发生的情况下点击“后退”并浏览应用程序;如果他单击“后退”,他应该被重定向到sessionexpired.xhtml页面 我将idleMonitor放在我的loggedintemplate.xhtml中,因此它只有在您登录时才起作用,无论您登录到哪个页面,因为在您登录后,我的所有页面都来自loggedin

我试图通过primefaces组件处理会话超时

我这样做是因为我需要让用户知道,由于不活动,会话已过期。我需要通过对话框显示此消息,在他关闭对话框后,应将其重定向到登录页面。他不应该在什么都没有发生的情况下点击“后退”并浏览应用程序;如果他单击“后退”,他应该被重定向到sessionexpired.xhtml页面

我将idleMonitor放在我的loggedintemplate.xhtml中,因此它只有在您登录时才起作用,无论您登录到哪个页面,因为在您登录后,我的所有页面都来自loggedintemplate.xhtml

我的loggedintemplate.xhtml中的代码如下所示:


因此,这段代码的功能基本上是检查用户是否在6秒钟内处于非活动状态,如果他处于非活动状态,则会弹出一个不可关闭的对话框,告诉他会话已过期

方法loginController.timeout()应该让用户注销,使会话无效等

我的问题是,如果我使用
FacesContext.getCurrentInstance().getExternalContext(),我不知道如何使会话无效,如何注销用户等等
.invalidateSession()它确实会使会话无效,但我需要更多。例如,如果用户处于非活动状态超过30分钟(默认的JavaEE超时时间),我会得到一个nullPointerException

我想“手动”处理超时,有没有办法禁用默认的JavaEE超时

手动处理超时的最佳方式是什么,而不是像这样:


20
javax.faces.application.ViewExpiredException
/expired.xhtml

我找到了一个非常好的解决方案,而且我不必处理NPE

以下场景:

如果用户空闲超过6秒,会话将通过ajax失效,无需用户交互。这意味着,即使用户空闲超过20分钟,会话也已经无效,我不必处理NPE

6秒钟后,会生成一个对话框(通过javascript警报),让用户知道他在一定时间内处于非活动状态,并且会话已过期。关闭对话框后,用户将重定向到登录页面

顺便说一句,我用了6秒来测试。我的默认设置是:

  • idlemonitor:30分钟
  • web.xml:40分钟(确保会话始终手动失效,用户可以看到会话过期信息的对话框)
这个解决方案完全符合我的要求

idlemonitor的代码:

<!-- language: lang-xml -->

<p:idleMonitor timeout="1800000" >
    <p:ajax event="idle" listener="#{loginController.timeout()}" oncomplete="alert('Session expired etc.')"/>
</p:idleMonitor>
public void timeout() throws IOException {
    FacesContext.getCurrentInstance().getExternalContext()
            .invalidateSession();
    FacesContext.getCurrentInstance().getExternalContext()
            .redirect("...loginpage.xhtml");

}

我认为,如果你能更具体地表达你的问题,你就可以提高回答问题的机会。我不知道是否可以在web.xml中一起禁用会话超时。但是,您可以将其设置为8小时,然后按照您已经执行的方式自行使会话无效。对于NPE,那么就检查一下这个。我们正是这样使用它的(使用primefaces idlemonitor)。我不明白你所说的“检查这个”是什么意思?你到底在哪里和什么时候得到NPE?以下哪一个
FacesContext.getCurrentInstance().getExternalContext().invalidateSession()为空
在什么时候?(检查这意味着:包括一个类似于
if(objectThatCouldBeNull!=null)
的检查。如果用户空闲超过20分钟(web.xml中的会话超时),我会使用NPE,并从我的对话框中单击OK按钮,该按钮是在用户空闲超过6秒(idlemonitor)时生成的。NPE出现了,因为我试图从一个bean调用一个方法,该bean已经失效(20分钟后)。我不知道我是否说得够清楚,总结一下:如果我空闲6秒,对话框就会出现。如果我单击“确定会话无效->工作正常”。但是,如果我空闲超过20分钟,会话默认无效,因此我在再次尝试无效时会得到NPE