2012-01-09 56 views
4

有沒有辦法讓頁面的會話保持活動狀態,而無需將狀態發送到客戶端?我無法將STATE_SAVING_METHOD設置爲client,我寧願不使用a4j:keepaliveJSF - 使會話保持無限期的活動

我試過使用一個簡單的隱藏iframe提交給有問題的Bean,但它使主頁面無效。

我正在使用JSF 1.2和myfaces。

這是爲了避開在頁面上ViewExpiredException不要求用戶登錄,大多數現有的網站需要用戶登錄。

+0

你能解釋一下用例嗎? – 2012-01-09 19:04:50

+0

@AdrianMitev當然,我添加了一些額外的評論。 ViewExpiredException在大約10分鐘後打響。我無法更改超時時間。 – OddProblems 2012-01-09 19:43:04

回答

10

實現一個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. 

這應該是它。

+2

該策略非常好,可以將web.xml中的會話超時降低至1分鐘,並保持要求具有較高的會話超時值。在web.xml中增加sessiont-timeout的問題是即使未使用的viewscoped邏輯視圖也會針對給定的超時進行存儲,以防您直接進行GET導航(而不是JSF導航)。 – Yamada 2015-08-28 17:31:02

3

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小時! :)

+1

我不推薦這個技巧。如果您在對話內部,您可能會遇到javax.enterprise.context.BusyConversationException。 例如,用戶單擊一個按鈕。與此同時,輪詢器會喚醒,但鑑於會話請求已序列化,如果前一個請求需要超過一秒,則輪詢器請求可能會超時(BusyConversationException)。 問題是輪詢器請求不應該存在於對話中。 BalusC解決方案完全避免了這個問題。 – agori 2015-10-27 13:30:27

+0

@agori,謝謝。在我的情況下,pf_usersController是CDI SessionScoped,而且我不使用對話作用域bean。 – Howard 2015-10-28 13:52:27