【问题标题】:Timeout via PrimeFaces p:idleMonitor通过 PrimeFaces p:idleMonitor 超时
【发布时间】:2013-03-20 09:28:24
【问题描述】:

我正在尝试通过 primefaces 组件 idlemonitor 处理会话超时。

我这样做是因为我需要让用户知道由于不活动而会话已过期。我需要通过对话框显示此消息,在他关闭对话框后,他应该被重定向到登录页面。他应该无法单击“返回”并浏览应用程序,就像什么也没发生一样;如果他点击“返回”,他应该被重定向到 sessionexpired.xhtml 页面。

我把 idleMonitor 放在我的 loggedintemplate.xhtml 中,所以它只有在你登录时才有效,无论在哪个页面,因为我所有的页面,在你之后登录,派生自 loggedintemplate.xhtml

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

<p:idleMonitor timeout="6000" onidle="idleDialog.show()" />

<p:dialog header="Timeout" resizable="false" closable="false" 
          widgetVar="idleDialog" modal="true">
    <p:panel styleClass="noborderpanel">
        <p:panelGrid columns="1" styleClass="adressegrid">
            <p:outputLabel value="Session has expired due to inactivity" />
                    <p:commandButton action="#{loginController.timeout()}"
                        value="Ok" />
        </p:panelGrid>
    </p:panel>
</p:dialog>

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

loginController.timeout() 方法应该将用户注销、使会话无效等。

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

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

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

<session-config>
    <session-timeout>20</session-timeout>
</session-config>   
<error-page>
    <exception-type>javax.faces.application.ViewExpiredException</exception-type>
    <location>/expired.xhtml</location>
</error-page>

【问题讨论】:

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

标签: jsf primefaces idle-timer


【解决方案1】:

我找到了一个效果很好的解决方案,而且我不必处理 NPE。

以下场景:

如果用户空闲超过 6 秒,则会话通过 ajax 无效,无需用户交互。也就是说,即使用户空闲超过 20 分钟,会话已经无效,我不必处理 NPE。

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

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

  • 空闲监视器: 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>

loginController.timeout() 的代码:

public void timeout() throws IOException {
    FacesContext.getCurrentInstance().getExternalContext()
            .invalidateSession();
    FacesContext.getCurrentInstance().getExternalContext()
            .redirect("...loginpage.xhtml");

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-07-31
    • 2017-03-28
    • 2015-02-08
    • 2022-01-23
    • 1970-01-01
    • 1970-01-01
    • 2019-03-10
    • 1970-01-01
    相关资源
    最近更新 更多