即使我在页面上进行交互,会话也会丢失

时间:2016-03-04 14:33:10

标签: session jsf primefaces

我正在使用primefaces 3.4.2 Javax.faces 2.1.9

我的web.xml

<session-config>
    <session-timeout>45</session-timeout>
</session-config>

<p:idleMonitor id="idMonitorSession" timeout="2400000"
                onidle="dlgMensajeSessionExp.show()" />

<p:dialog header="Sesion Ended" resizable="false"
                widgetVar="dlgMensajeSessionExp" width="300" height="120"
                modal="true" closable="false" appendToBody="true">
                <center>
                    <h:outputText value="Session Ended" />
                    <h:form id="sessionForm">
                        <h:commandLink actionListener="#{user.exit()}">
                            <h:graphicImage style="border:0px" value="/resources/images/login.png"
                                width="80px" />
                        </h:commandLink>
                    </h:form>
                </center>
            </p:dialog>

然而,即使我在页面中工作,会话也会丢失,你知道为什么会这样吗,

Web Server是Websphere 7.0.0.17

1 个答案:

答案 0 :(得分:1)

以不通过ajax或完整表单发布服务器的方式与页面交互不会重置会话服务器端的超时。为idleMonitor使用ajax事件应该可以解决问题。

<p:idleMonitor id="idMonitorSession" timeout="2400000"
            onidle="dlgMensajeSessionExp.show()">     
  <p:ajax event="active"/>
</p:idleMonitor>

编辑:我注意到移动鼠标时“激活”事件不会触发,用户将需要与页面进行足够的交互以触发此事件。如果保持服务器与页面同步至关重要,则需要比此事件创建的更频繁地调用ajax调用。您不必在服务器端调用noop操作,设置事件类型就足够了。

另一种可能性是在发生交互类型时使用ajax事件,表明您的用户正在积极使用该页面。例如,在文本区域中键入长消息或过滤大型数据表。

<p:ajax event="filter" listener="#{bean.activeListener}"/>

无论哪种方式,目标都是让服务器意识到用户确实处于活动状态,而不会使服务器充满不必要的ajax事件。