有沒有辦法讓頁面的會話保持活動狀態,而無需將狀態發送到客戶端?我無法將STATE_SAVING_METHOD
設置爲client
,我寧願不使用a4j:keepalive
。JSF - 使會話保持無限期的活動
我試過使用一個簡單的隱藏iframe提交給有問題的Bean,但它使主頁面無效。
我正在使用JSF 1.2和myfaces。
這是爲了避開在頁面上ViewExpiredException不要求用戶登錄,大多數現有的網站需要用戶登錄。
有沒有辦法讓頁面的會話保持活動狀態,而無需將狀態發送到客戶端?我無法將STATE_SAVING_METHOD
設置爲client
,我寧願不使用a4j:keepalive
。JSF - 使會話保持無限期的活動
我試過使用一個簡單的隱藏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}
打印剩餘秒會話還沒有按照服務器端配置(這是<session-timeout>
在web.xml
中可控制的方式)並且已經被扣除10秒,只是在它自動過期之前準時,並且轉換爲毫秒以便它適合setInterval()
預計。
$.get()
在給定的URL上發送一個ajax GET請求。對於上面的例子,你需要對/poll
URL模式映射一個servlet和基本上沒有在doGet()
方法如下:
request.getSession(); // Keep session alive.
這應該是它。
該策略非常好,可以將web.xml中的會話超時降低至1分鐘,並保持要求具有較高的會話超時值。在web.xml中增加sessiont-timeout的問題是即使未使用的viewscoped邏輯視圖也會針對給定的超時進行存儲,以防您直接進行GET導航(而不是JSF導航)。 – Yamada 2015-08-28 17:31:02
BalusC's answer幫助我在我的應用程序中滿足這個要求,但是因爲我使用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();
}
一如既往,謝謝,BalusC!
編輯:最終用戶把這個測試今天早上,它工作的很棒!我的應用程序通常會在整個頁面刷新後15分鐘強制會話超時(通過基於session.maxInactiveInterval和web.xml中的會話超時值的元刷新重定向到sessionExpired.xhtml);如果用戶在一個頁面上執行一堆AJAX請求,由於AJAX!=完整頁面刷新,會話將超時,但此代碼允許enduser在應用程序中的工資單頁面上保持活動狀態,並且會話保持活動狀態1至2小時! :)
我不推薦這個技巧。如果您在對話內部,您可能會遇到javax.enterprise.context.BusyConversationException。 例如,用戶單擊一個按鈕。與此同時,輪詢器會喚醒,但鑑於會話請求已序列化,如果前一個請求需要超過一秒,則輪詢器請求可能會超時(BusyConversationException)。 問題是輪詢器請求不應該存在於對話中。 BalusC解決方案完全避免了這個問題。 – agori 2015-10-27 13:30:27
@agori,謝謝。在我的情況下,pf_usersController是CDI SessionScoped,而且我不使用對話作用域bean。 – Howard 2015-10-28 13:52:27
你能解釋一下用例嗎? – 2012-01-09 19:04:50
@AdrianMitev當然,我添加了一些額外的評論。 ViewExpiredException在大約10分鐘後打響。我無法更改超時時間。 – OddProblems 2012-01-09 19:43:04