我有使用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会话?
答案 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中找到如何为此注册错误页面以及如何在那里使用元刷新标头。