2012-01-09 36 views
4

状態をクライアントに送信せずにページのセッションをアクティブに保つ方法はありますか? STATE_SAVING_METHODclientに設定できません。a4j:keepaliveを使用しないことをおすすめします。JSF - セッションを無期限に維持する

問題のBeanに送信する単純な隠しiframeを使用しようとしましたが、メインページが無効になりました。

私はJSF 1.2とmyfacesを使用しています。

これは、既存のサイトの大半は、ログインするユーザーが必要です。ログインするユーザーを必要としないページのViewExpiredExceptionを回避することである。

+0

ユースケースについて説明できますか? –

+0

@AdrianMitev確かに、私はいくつかのコメントを追加しました。 ViewExpiredExceptionは約10分後に発生します。タイムアウト時間を変更することはできません。 – OddProblems

答えて

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パターンのサーブレットをマップする必要があり、基本的にdoGet()方法では、以下のん:

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

それでなければなりません。

+2

この戦略は素晴らしいですし、web.xmlのsession-timeoutを1分に減らし、高いセッションタイムアウト値を持つようにする必要があります。 web.xmlのsessiont-timeoutを増加させる問題は、(JSF Navigationとは対照的に)GETナビゲーションを指示する場合に、未使用のビュースコープの論理ビューが指定されたタイムアウトに格納されることです。 – Yamada

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のセッションタイムアウト値に基づいてmeta refreshを使ってsessionExpired.xhtmlにリダイレクトします)。 AJAX!=フルページのリフレッシュが行われているので、セッションはタイムアウトしますが、このコードはエンドユーザーがアプリケーションの給与計算ページにいる間にエンドユーザーに「セッションを有効にしてください」を許可し、セッションは有効です1〜2時間! :)

+1

私はこのトリックをお勧めしません。会話の中にいる場合は、javax.enterprise.context.BusyConversationExceptionが発生する可能性があります。 たとえば、ユーザーがボタンをクリックします。その間にポーリングが起きますが、会話のリクエストがシリアライズされるので、以前のリクエストに1秒以上かかるとポーリングリクエストがタイムアウト(BusyConversationException)する可能性があります。 問題は、ポーラー要求が会話内に生きてはならないということです。 BalusCソリューションはこの問題を完全に回避します。 – agori

+0

@agori、ありがとう。私の場合、pf_usersControllerはCDI SessionScopedで、会話スコープのBeanは使用しません。 – Howard

関連する問題