session.maxInactiveInterval和AJAX上的元刷新不相处

时间:2015-08-20 12:32:45

标签: ajax jsf redirect session-timeout

我有使用PrimeFaces 5.1的JSF网页,我希望在会话过期后将重定向重定向到某个xhtml页面。

我在web.xml中将会话超时设置为1分钟(用于测试后将其设置为30)

<session-config>
    <session-timeout>1</session-timeout>
</session-config>

我添加了

<meta http-equiv="refresh" content="#{session.maxInactiveInterval};url=#{request.contextPath}/season_expired.xhtml"/>

到应用程序每个页面上使用的默认模板的<h:head>

大部分时间(当我在页面之间移动等等)时,一切正常。除非我使用某种形式,其中每次刷新都是由AJAX制作的。然后我在一分钟后被重定向。

有没有办法去刷新&#34;与AJAX会话?

1 个答案:

答案 0 :(得分:2)

您可以将JS setTimeout()用于在发出ajax请求时可以使用clearTimeout()清除的内容。您可以使用jsf.ajax.addOnEvent()注册全局ajax事件侦听器函数。

<script>
    var redirectToExpired = function() { window.location='#{request.contextPath}/expired.xhtml' };
    var expireTimeMillis = 5000;

    window.redirectOnExpire = setTimeout(redirectToExpired, expireTimeMillis);
    jsf.ajax.addOnEvent(function(data) {
        if (data.status == 'begin') {
            clearTimeout(window.redirectOnExpire);
            window.redirectOnExpire = setTimeout(redirectToExpired, expireTimeMillis);
        }
    });
</script>

与元刷新标头一样,这有点天真,因为当您在多个浏览器标签中打开相同的Web应用程序时,它不能很好地工作。在一个被遗忘的&#34;选项卡,当您在另一个标签中的同一个网络应用中激活时,重定向仍会在后台进行。

最好是不要那么做,而是在真实的用户操作中依赖ViewExpiredException。您可以在javax.faces.application.ViewExpiredException: View could not be restored中找到如何为此注册错误页面以及如何在那里使用元刷新标头。

另见: