2012-03-19 6 views
3

JSF 2.0でフィルタを使用してセッションの有効期限を処理しています。ここでは、コードセッション終了時にユーザーをタイムアウトページに移動する方法、ユーザーがブラウザの戻るボタンをクリックした場合

@Override 
public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) 
     throws IOException, ServletException { 

    HttpServletRequest httpServletRequest = (HttpServletRequest) request; 
    HttpServletResponse httpServletResponse = (HttpServletResponse) response; 

    HttpSession session = httpServletRequest.getSession(false); 

    if (session == null) { 

     //session timeout check. 
     if (httpServletRequest.getRequestedSessionId() != null && !httpServletRequest.isRequestedSessionIdValid()) { 

      System.out.println("Session has expired"); 
      session = httpServletRequest.getSession(true); 
      session.setAttribute("logedin", "0"); // public user    
      httpServletResponse.sendRedirect(timeoutPage); 

     } else { 

      session = httpServletRequest.getSession(true); 
      session.setAttribute("logedin", "0"); 
      filterChain.doFilter(httpServletRequest, httpServletResponse); 
     } 
    } 
} //end of doFilter() 

はある。しかし、セッションの有効期限が切れたときに問題があると、ユーザーが[戻る]ボタンをクリックした場合、その後、彼はすべてのアウトスタイルでページを取得します。とにかくセッションが終了し、ユーザーがブラウザの戻るボタンをクリックすると、彼はtimeoutPageに指示します。

さらに、私は、datatableのように私のページにPrime Facesコンポーネントも使用しています。私は改ページを使用しています。セッションがタイムアウトすると、ページネーションをクリックするとセッションの有効期限のメッセージが表示されません。それは、AJAXのリクエストはフィルタを呼び出さないようですか?どうすれば私のajaxイベントに接続できますか、またはdatatableページネーションイベントをセッションの有効期限まで言うことができますか?

おかげ

答えて

5

セッションが期限切れになると戻るボタンのユーザークリックが、その後、彼はすべてが

をスタイリングしてページを取得する場合は、キャッシュしないようにブラウザに指示する必要がある場合ブラウザキャッシュ内のページ。ブラウザは代わりにサーバーに完全な要求を送信しています。

filterChain.doFilter()コールの直前に次の行を追加してください。


アウトセッション時間は、と私は改ページをクリックして、セッションの期限切れメッセージが表示されない場合

if (!httpServletRequest.getRequestURI().startsWith(httpServletRequest.getContextPath() + ResourceHandler.RESOURCE_IDENTIFIER)) { // Skip JSF resources (CSS/JS/Images/etc) httpServletResponse.setHeader("Cache-Control", "no-cache, no-store, must-revalidate"); // HTTP 1.1. httpServletResponse.setHeader("Pragma", "no-cache"); // HTTP 1.0. httpServletResponse.setDateHeader("Expires", 0); // Proxies. } 

。それは、AJAXのリクエストはフィルタを呼び出さないようですか?あなたは完全にJSFのAjaxのエンジンによって無視され、その後、HTTPステータス302レスポンスが送信されます同期リダイレクトを送信する場合

JSFのAJAX要求はHTTPステータス200とXML応答を期待しています。代わりに、リダイレクトを実行するようにJSF ajaxエンジンに指示するXMLの特定の部分とともに通常のHTTP 200応答を送信する必要があります。この代わりのhttpServletResponse.sendRedirect()の操作を行います。(例えば、多分@ManagedBeanPhaseListenerまたはSystemEventListenerかによって)JSFコンテキスト内で既にしているとき、あなたはちょうどExternalContext#redirect()メソッドを使用することができることを

if ("partial/ajax".equals(httpServletRequest.getHeader("Faces-Request"))) { 
    httpServletResponse.setContentType("text/xml"); 
    httpServletResponse.getWriter() 
     .append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>") 
     .printf("<partial-response><redirect url=\"%s\"></redirect></partial-response>", timeoutPage); 
} 
else { 
    httpServletResponse.sendRedirect(timeoutPage); 
} 

注意を。同期/非同期要求を透過的に処理します。

+0

HHmmので、 '..httpServletResponse.setHeader(" Pragma "、" no-cache "); ..'これはブラウザの戻るボタンを押すとコンストラクタが呼び出されることを意味します。 'no-cache'を設定しないと、ブラウザの戻るボタンを押すと、コンストラクタは呼び出されず、ブラウザはキャッシュを使ってページを表示します。私は正しい? – Basit

+0

Beanがリクエスト/ビュースコープの場合は正しいです。ブラウザは、ブラウザキャッシュから古いページを表示するのではなく、サーバーに完全なHTTPリクエストを送信します(フィルタで必要なチェックをすべて実行できます)。 – BalusC

+0

あなたはajaxの部分を定義したように、もう一つ重要なことです。ページングをクリックしたときに、フィルタがセッションの有効期限が切れているが、HTTPステータス302の応答が原因でリダイレクト要求が無視されていると言うことになります。それは...ですか? – Basit

関連する問題