leo*_*tiw 2 jsf primefaces idle-timer
我正在尝试通过primefaces 组件idlemonitor处理会话超时。
我这样做是因为我需要让用户知道由于不活动,会话已过期。我需要通过对话框显示此消息,在他关闭对话框后,他应该被重定向到登录页面。他不应该能够像什么都没发生一样单击“后退”并浏览应用程序;如果他点击“后退”,他应该被重定向到 sessionexpired.xhtml 页面。
我将idleMonitor放在logintemplate.xhtml中,因此只有在您登录时它才起作用,无论在哪个页面上,因为登录后我的所有页面都源自loggedintemplate.xhtml。
我的logintemplate.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>
Run Code Online (Sandbox Code Playgroud)
因此,这段代码的功能主要是检查用户是否在 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>
Run Code Online (Sandbox Code Playgroud)
我找到了一个非常有效的解决方案,而且我不必处理 NPE。
以下场景:
如果用户空闲时间超过 6 秒,会话将通过 ajax 失效,无需用户交互。这意味着,即使用户空闲超过 20 分钟,会话也已经无效,我不必处理 NPE。
6 秒后,会生成一个对话框(通过 javascript 警报),让用户知道他在一定时间内处于非活动状态并且会话已过期。对话框关闭后,用户将被重定向到登录页面。
顺便说一句,我用了 6 秒只是为了测试目的。我的默认设置是:
该解决方案完全符合我的要求。
空闲监视器代码:
<!-- language: lang-xml -->
<p:idleMonitor timeout="1800000" >
<p:ajax event="idle" listener="#{loginController.timeout()}" oncomplete="alert('Session expired etc.')"/>
</p:idleMonitor>
Run Code Online (Sandbox Code Playgroud)
LoginController.timeout() 的代码:
public void timeout() throws IOException {
FacesContext.getCurrentInstance().getExternalContext()
.invalidateSession();
FacesContext.getCurrentInstance().getExternalContext()
.redirect("...loginpage.xhtml");
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
13903 次 |
| 最近记录: |