session.maxInactiveInterval 和 AJAX 上的元刷新不合得来

Meta refresh on session.maxInactiveInterval and AJAX don't get along

我有一个使用 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 进行。然后我在一分钟后被重定向。

有没有办法 "refresh" 与 AJAX 进行会话?

您可以使用 JS setTimeout() for that which you can clear out with clearTimeout() when an ajax request is made. You can use 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>

与元刷新 header 一样,这有点天真,因为当您在多个浏览器选项卡中打开相同的 Web 应用程序时,它不能很好地工作。在“被遗忘”的选项卡中,当您在另一个选项卡中使用同一网络应用程序时,重定向仍会在后台发生。

更好的做法是不要全部都这样做,而是在真正的用户操作过程中依赖 ViewExpiredException。您可以在 javax.faces.application.ViewExpiredException: View could not be restored 中找到如何为此注册错误页面以及如何在那里使用元刷新 header。

另请参阅: