让会话无限期地保持活跃状态

Odd*_*ems 4 jsf viewexpiredexception

有没有办法让页面的会话保持活动而不需要将状态发送到客户端?我不能够设置STATE_SAVING_METHODclient,我宁愿不使用a4j:keepalive.

我已经尝试使用提交给Bean的简单隐藏iframe,但它使主页无效.

我正在使用JSF 1.2和myfaces.

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

Bal*_*usC 13

实施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>
Run Code Online (Sandbox Code Playgroud)

${pageContext.session.maxInactiveInterval}打印的剩余秒会话尚未根据所述服务器侧配置(其是由通过可控的方式住<session-timeout>web.xml),并扣除10秒,刚要按时自动到期之前,并转换为毫秒这么它符合setInterval()预期.

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

request.getSession(); // Keep session alive.
Run Code Online (Sandbox Code Playgroud)

那应该是它.

  • 这个策略很棒,允许将web.xml中的会话超时减少到1分钟,并保持要求具有高会话超时值.在web.xml中增加sessiont-timeout的问题是,即使未使用的视图结合逻辑视图也将存储给定超时,以防您直接进行GET导航(而不是JSF导航). (2认同)

How*_*ard 5

BalusC的回答帮助我在我的应用程序中满足了这个要求,但由于我使用的是PrimeFaces,我想分享一下BalusC的答案如何激发了我用来做这个的代码.

xhtml页面

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

public void keepUserSessionAlive() {
    FacesContext context = FacesContext.getCurrentInstance();
    HttpServletRequest request = (HttpServletRequest) context.getExternalContext().getRequest();
    request.getSession();
}
Run Code Online (Sandbox Code Playgroud)

一如既往,谢谢你,BalusC!

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