2011-10-17 25 views
1

問題:私は自分のアプリケーションの一部のページにいて、しばらく離れます。表示されたリンクをクリックすると、「viewIDを復元できません」というメッセージが表示されます。リフレッシュと同じです。次に、新しいセッションがあるセッションタイムアウトを正常に処理する方法は何ですか?

http://localhost:8080/myapp/index.xhtml 

http://localhost:8080/myapp/index.xhtml?windowId=e9d 

私は新しいセッションを開始することができますが、私は次のように手動でURLを編集する必要があります。

アクティブアドレスウィンドウ確立され、ユーザーは私が欲しいものを再度ログインする必要があります。

これに対処する方法を調べるには、クライアントサイドのJavascriptを使用してセッションを生きている状態に保つために定期的にリクエストを送信することによって、セッションを生き生きとさせる多くの "解決策"があります。個人的に私はこれを望ましい解決策とは考えていません。

私が望むのは、セッションがタイムアウトするときに、非公開ページへのすべての後続のリクエストをindex.xhtmlに送る必要があることです。ログインを必要としないページへの参照は、新しいセッションオブジェクトを経由しなければなりません。これは、JSF 2で定義された機能だけを使用して処理するのが望ましいですが、Servletフィルタを書くのは気にしません。

誰かが私が見逃したハウツーへのリンクを提供することはできますか?

答えて

4

Filterで行います。

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException { 
    HttpServletRequest req = (HttpServletRequest) request; 
    HttpServletRequest res = (HttpServletResponse) response; 

    if (req.getRequestedSessionId() != null && !req.isRequestedSessionIdValid()) { 
     res.sendRedirect(req.getContextPath() + "/index.xhtml"); 
    } else { 
     chain.doFilter(request, response); 
    } 
} 

しかし、それは現れます:あなたは(つまり、セッションはサーバ側に失効されていない)クライアントは、それがまだ有効であるかどうかを確認するために、セッションクッキーと HttpServletRequest#isRequestedSessionIdValid()を送信したかどうかを確認するために HttpServletRequest#getRequestedSessionId()を使用することができます別の質問、どのように正確にログインしているユーザーをフィルタリングしていますか?セッションが終了した場合、ユーザーはもうログインしません。代わりに、ユーザーがログインしているかどうかにかかわらず、フィルタにチェックインすることもできます。

+0

私はアプリケーションレベルでユーザー認証を処理しています。ログインと呼ばれる@SessionScoped Beanがあり、そのプロパティの1つは、ユーザーがログインしていない場合はnullのユーザーオブジェクトです。サンプルコードを変更するだけで、フィルターからマネージドBeanをフェッチする方法を知っていると思いますそれに応じて。 sendRedirect()呼び出しが要求のそれ以上の処理を中止すると仮定することはできますか? – AlanObject

+0

はい、そうです。他のすべてのフィルタ/サーブレット( 'FacesServlet'も)は、' chain.doFilter() 'によってリクエスト/レスポンスを続けるときにのみ呼び出されます。関連:http://stackoverflow.com/questions/6883430/prevent-accessing-restricted-page-without-login-in-jsf2 – BalusC

+0

セッションスコープのオブジェクトにアクセスする必要があるため、このソリューションで問題が発生しました。認証ステータス。 Filter内のFacesContextオブジェクトへのアクセス権を得ることは、最高で苦労します。代わりにこれを行うにはPhaseListenerを使用する方がよいでしょうか?私はここにあなたのWebページを見ています:http://balusc.blogspot.com/2006/06/communication-in-jsf.html#AccessingTheFacesContextInsideHttpServletOrFilter – AlanObject

関連する問題