web-dev-qa-db-ja.com

JBoss AS5で実行されているJSFWebアプリケーションでの「セッションの期限切れ」の処理

この質問は私の他の質問に関連しています " セッションの有効期限が切れたときにログインページにリダイレクトする方法Java Webアプリケーション? "。以下は私がしようとしていることです行う:

  1. JBoss AS5で実行されているJSFWebアプリケーションがあります
  2. ユーザーがたとえば15分間非アクティブである場合、セッションの有効期限が切れた後にユーザーがアプリケーションを使用しようとしている場合は、ユーザーをログアウトしてログインページにリダイレクトする必要があります。
  3. そのため、「 JSF Logout and Redirect 」で提案されているように、セッションの期限切れ状態をチェックし、セッションの場合はユーザーをsession-timed-out.jspページにリダイレクトするフィルターを実装しました。期限切れです。
  4. Web.xmlの他のすべてのフィルター定義の上にSessionExpiryCheckFilterを追加したので、セッションの有効期限チェックは常に最初のヒットを取得します。

今、私が直面しているチャレンジがやってくる。 JBoss ASを使用しているため、セッションの有効期限が切れると、JBossは自動的にログインページにリダイレクトします(セッションの有効期限チェックフィルターは呼び出されないことに注意してください)。そのため、ログイン後、SessionExpiryCheckFilterがリクエストをインターセプトし、セッションが使用可能であると認識します。ただし、例外javax.faces.application.ViewExpiredException: viewId:/mypage.faces - View /mypage.faces could not be restored.がスローされます。

誰かが以前にこの問題に直面したことがありますか?この問題を解決するためのアイデアはありますか?

18
Veera

次のアプローチは私のために働きます。これを機能させるには、jspリダイレクトではなくJSTLコアtaglibリダイレクトを使用する必要があることに注意してください(jspも期限切れになるため)。

FacesConfig.xmlに次のように入力します。

<error-page>
    <exception-type>javax.faces.application.ViewExpiredException</exception-type>
    <location>/sessionExpired.jsf</location>
</error-page>

sessionExpired.jsp

<%@page contentType="text/html" pageEncoding="UTF-8"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<%@ taglib uri="http://Java.Sun.com/jsp/jstl/core" prefix="c" %>

<c:redirect url="/login.jsf" />

このアプローチは、他のエラータイプまたは例外にも使用できます。たとえば、要素には、エラーコードまたは例外タイプとWebアプリケーションのリソースのパスとの間のマッピングが含まれています。

<error-page>
    <error-code>400</error-code>
    <location>/400.html</location>
</error-page>

または要素に、Java例外タイプの完全修飾クラス名が含まれています。

<error-page>
    <exception-type>javax.servlet.ServletException</exception-type>
    <location>/servlet/ErrorDisplay</location>
</error-page>
14
Chris Dale

Mojarra/Sun RIを使用している場合は、これをweb.xmlに追加してみてください。

<context-param>
    <param-name>com.Sun.faces.enableRestoreView11Compatibility</param-name> 
    <param-value>true</param-value>
</context-param>

ただし、これが常に完璧なソリューションであるとは限らないことに注意してください。ユーザーがセッションを失ったという事実を隠します。

3
skytteren

復元ビューにjavax.faces.event.PhaseListenerを実装する

@Override
public void afterPhase(PhaseEvent event) {
    FacesContext facesContext = event.getFacesContext();
     if(facesContext.getViewRoot()==null){   
       try{   
           facesContext.getExternalContext().redirect(HOME_PAGE);   
           facesContext.responseComplete();   
       } catch (IOException e){   
           e.printStackTrace();   
       }   
     }
}

@Override
public void beforePhase(PhaseEvent event) {}

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

faces-config.xmlに登録します

1
keith

私はそれのためにフィルターを書こうとしましたが、それが私にとってうまくいかなかったので、私はそれの代わりを作りました。

ログインせずにユーザーにアクセスさせたくないすべてのページで、このようにしました。

_<f:view>
    <h:dataTable value="#{userHome.validuser()}"/>
     // my code
<f:view/>
_

これにより、セッション管理対象Beanにある関数validuser()が呼び出されます。

これが私の機能です。ログイン中に、私はすでにユーザーオブジェクトをセッションに挿入しています。

_public void validuser()
{
     FacesContext context = FacesContext.getCurrentInstance();
    UserLogin ul = (UserLogin) context.getExternalContext().getSessionMap().get("userbean");

     if (ul == null)
         try{
                context.getExternalContext().redirect("/HIBJSF/faces/LoginPage.xhtml");
                context.responseComplete();
        }
         catch (IOException e)
        {
         e.printStackTrace();
        }
} 
_

セッションはあるが誰もログインしていない場合は、リダイレクトページに移動します。

0
ifti

フィルタと組み合わせてセッションリスナーを作成することをお勧めします。

セッションの有効期限が切れたら、新しいセッションオブジェクトを作成し、新しいオブジェクトにタイムアウト値を設定できます。

フィルタでタイムアウト値を確認し、ブラウザをリダイレクトするだけです。

http://www.Java2s.com/Code/Java/Servlets/Servletsessionlistener.htm を参照してください。

0
Koekiebox