2011-12-06 12 views
12

条件付きで別のビューにリダイレクトするビルドインメカニズムはありますか?ユーザーが既にログインしている場合は、ログインページから「ホームページ」にリダイレクトされます。JSFの条件付きリダイレクション

私は既に2つの基本的なアプローチを持っていますが、最初はどのように達成するのか、秒は汚れた回避策のようなものです。

  1. <meta http-equiv="Refresh" content="0; URL=home.jsf" />を追加し、それが条件付き(EL:#{login.loggedIn})にレンダリングさせ
  2. リダイレクトをやって、いくつかのJavaScriptを含む、また条件付きでレンダリングされます<h:panelGroup />を追加します。

、あるいは別の、よりエレガントなソリューションを実現する方法はありますか?あなたはこのために<f:event type="preRenderView">を使用することができます:-)

おかげ

答えて

18

など。

<f:event type="preRenderView" listener="#{login.checkAlreadyLoggedin}" /> 

public void checkAlreadyLoggedin() throws IOException { 
    if (isLoggedIn()) { 
     ExternalContext ec = FacesContext.getCurrentInstance().getExternalContext(); 
     ec.redirect(ec.getRequestContextPath() + "/home.xhtml"); 
    } 
} 
+0

パーフェクトに

FacesContext fc = FacesContext.getCurrentInstance(); NavigationHandler navigationHandler = fc.getApplication().getNavigationHandler(); navigationHandler.handleNavigation(fc, null, "/views/nonDefaultView.xhtml?faces-redirect=true"); fc.renderResponse(); 

クレジット:それはpreRenderViewメソッド内で、次の操作を行い、です! charmeのように動作します、ありがとう。その間、私は別のアプローチを発見して試しました。ログインページ専用に登録されたフィルタを実装しましたが、 '@ SessionScoped'' login' beanやそれが管理する' User'にアクセスできなかったので失敗しました。セッションは空だっ​​た...? – Kai

+0

フィルタはJSFの '@ ManagedBean'に対してのみ動作し、CDI' @ Named'では動作しません。 – BalusC

+0

ああ、OK!私はこれが何とかJEEコンテナによって保証されると思いました... – Kai

0

で@BalusCによって設定ソリューションは、ビュー「home.xhtmlは、」JSFポートレットのデフォルトのビューでない場合には動作しません。レンダーフェーズ中にデフォルト以外のビューにリダイレクトする必要がある人には、this entryの解決策を提案します。 @Frizz1977