2011-01-20 3 views
2

JSF 1.2アプリケーションでセッションが進行中で、セッションタイムアウトまたはユーザーがブラウズバックまたは更新ページを押すたびにセッションが乱れる予期せず行動するようになります。JSFセッションのタイムアウト/リフレッシュ/バック/フォワードを検出してログイン画面に戻る

私は、そのようなことが起こるたびに、ユーザーを定義済みのログイン画面に戻すことができます。 認証はJSFアプリケーション内で処理されます。

ありがとうございました!はい、あなたが配置する必要がいけない

MyPhaseListener.java

のfaces-config.xmlの

<faces-config version="1.2" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_1_2.xsd"> 

(...) 

    <lifecycle> 
     <phase-listener>yourPackage.MyPhaseListener</phase-listener> 
    </lifecycle> 

(...) 

</faces-config> 

でリスナーを設定

public class MyPhaseListener implements PhaseListener { 

    public void afterPhase(PhaseEvent event) { 
     //If you have a login, so you have a user in session. Try to retrieve this value 
     //and it will return null if the user is not logged in or theres no more session 
     //and... 

     if (null == FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("myUserInSession") { 

     //Redirect to login using mapped navigation configs in faces-config.xml 
     try { 
      NavigationHandler nh = FacesContext.getCurrentInstance().getApplication().getNavigationHandler(); 
      nh.handleNavigation(FacesContext.getCurrentInstance(), null, "stringToReturnLogin"); 
     } catch (Exception e) { 
     } 

     //OR using redirect  
     try { 
      FacesContext.getCurrentInstance().getExternalContext().redirect("http://localhost:xxxx/App_Context/Page.xhtml"); 
     } catch (Exception e) { 
     } 
     } 
    } 

    public void beforePhase(PhaseEvent event) { 
     //Do nothing 
    } 

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

答えて

3

PhaseListener

例を使用してみてください".java"

+0

これは、ユーザーがバックボタンまたはリフレッシュボタンを押していることを処理しますか? – Ben

+0

私は知りません、試してください..私のアプリは完全なAJAXなので、歴史的なものを生成せず、ブラウザの戻るボタンは常に無効になっています。私はF5とコンテクストメニューをブロックしました(リッチフェイスを使って自分のコンテキストメニューを作った)。 – Renan

+0

PhaseId.RESTORE_VIEW。このようにこのメソッドをオーバーライドすると、すべてのフェーズのRESTORE_VIEWが返されます。私はそれがPhaseId.ANY_PHASEであるべきだと思います。 – Krishna

1

私はこれが遅いと知っていますが、とにかくここに行くのです。 あなたはおそらく、あなたのweb.xml ViewExpiredExceptionをリダイレクトします

<error-page> 
    <exception-type>javax.faces.application.ViewExpiredException</exception-type> 
    <location>/faces/sales/index.xhtml</location> 
</error-page> 

に次のように配置します。私はそれが出てくる他の例外のために保持すると思います。

関連する問題