2012-05-04 18 views
0

私は、ユーザーがログインしているかどうかをチェックし、そうでない場合はユーザーをログインページにリダイレクトするサーブレットフィルターを実装しました。このチェックをフィルタとして実行するのは、web.xmlのFROM auth-methodを使用してリダイレクトできない別のWebアプリケーションにログインページが存在し、別のコンテキストルートを持つ別のWebアプリケーションにあるページにリダイレクトするためです(私はweblogic 11gを使用しています)。JSF 2.0 - ユーザーがログインしていない場合の確認とリダイレクト

私が経験している問題は、ボタンのようなコンポーネントがあると、サーブレットフィルタがユーザーをリダイレクトできないということです。すなわち、彼らは彼らがいたページの右に戻る。

私はこのログインした小切手を行うべき別の方法はありますか?

+0

位相リスナーが適切でしょうか? – BestPractices

+0

関連:http://stackoverflow.com/questions/9305144/using-jsf-2-0-facelets-is-there-a-way-to-attach-a-global-listener-to-all-ajax/9311920 #9311920 – BalusC

答えて

2

RESTORE_VIEWフェーズの前に実行されるJSF 2.0フェーズリスナーとしてサーブレットフィルタを再実装しました。ロジックをフェーズ・リスナーに移すことで、AJAXリクエストのリダイレクトを処理するJSFの機能を利用することができました。基本的に、JSF 2.0はクライアント側でリダイレクトを行うための適切なAJAX応答を作成します。ユーザーがログインしていない場合は明確にするために、このメカニズムは、AJAXと非AJAX要求のリダイレクトを行うことがある。具体的

、それは次の応答戻って送信されます:。

<?xml version="1.0" encoding="utf-8"?> 
<partial-response> 
    <redirect url="/contextpath/faces/ajax/redirecttarget.xhtml"> 
    </redirect> 
</partial-response>" 

コードのために位相リスナー:

public PhaseId getPhaseId() 
{ 
    return PhaseId.RESTORE_VIEW; 
} 

public void afterPhase(PhaseEvent event) 
{ 
    ExternalContext ec = FacesContext.getCurrentInstance().getExternalContext(); 
    HttpSession session = (HttpSession)ec.getSession(false); 

    if (session==null || session.getAttribute(IS_LOGGED_IN_INDICATOR) == null) 
    { 
     try 
     { 
      ec.redirect(LOGIN_PAGE_URL); 
     } 
     catch(IOException e) 
     { 
      // log exception... 
     }   
    } 
} 
+1

PhaseListenerは、JSF以外のリクエストでは起動しません。したがって、JSF以外のリソースも確保していれば、それはチェックされません。フィルタでジョブを複製するか、フィルタ内でジョブを完全に実行する必要があります。 – BalusC

関連する問題