使会话无限期保持活动状态



有没有一种方法可以在不向客户端发送状态的情况下保持页面会话的活动状态?我无法将STATE_SAVING_METHOD设置为client,我更希望不使用a4j:keepalive

我尝试过使用一个简单的隐藏iframe提交给有问题的Bean,但它会使主页无效。

我使用的是JSF 1.2和myfaces。

这是为了绕过不需要用户登录的页面上的ViewExpiredException。大多数现有网站都需要用户登录。

将ajax轮询实现为"心跳",以保持会话的活力。最简单的是,你可以通过一个小jQuery来实现这一点,以避免100行的样板代码,使其能够在世界上已知的所有不同浏览器中工作:

<script src="http://code.jquery.com/jquery-latest.min.js"></script>
<script>
    $(document).ready(function() {
        setInterval(function() {
            $.get("${pageContext.request.contextPath}/poll");
        }, ${(pageContext.session.maxInactiveInterval - 10) * 1000});
    });
</script>

${pageContext.session.maxInactiveInterval}根据服务器端配置(顺便说一下,可由web.xml中的<session-timeout>控制)打印会话尚未运行的剩余秒数,并减去10秒,以便在其自动到期之前准时,并转换为毫秒,以满足setInterval()的期望。

$.get()在给定的URL上发送一个ajax GET请求。对于上面的示例,您需要在/poll的URL模式上映射一个servlet,并在doGet()方法中基本上执行以下操作:

request.getSession(); // Keep session alive.

应该是这样。

BalusC的回答帮助我在应用程序中满足了这一要求,但由于我使用的是PrimeFaces,我想分享BalusC是如何启发我使用的代码来实现这一点的。

xhtml页面

<p:poll listener="#{pf_usersController.keepUserSessionAlive()}"
        interval="#{session.maxInactiveInterval - 10}" />

public void keepUserSessionAlive() {
    FacesContext context = FacesContext.getCurrentInstance();
    HttpServletRequest request = (HttpServletRequest) context.getExternalContext().getRequest();
    request.getSession();
}

一如既往,谢谢你,巴鲁斯!

编辑:今天早上,一位用户对它进行了测试,效果很好!我的应用程序通常在整个页面刷新后15分钟强制会话超时(基于session.maxInactiveInterval和web.xml中的会话超时值,通过元刷新重定向到sessionExpired.xhtml);如果用户在一个页面上执行一堆AJAX请求,会话将超时,因为AJAX!=完整页面刷新,但此代码允许最终用户在应用程序的工资单页面上时"保持会话有效",并且会话有效期为1到2小时!:)

最新更新