18

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

  1. JBoss AS 5 で JSF Web アプリケーションを実行しています。
  2. ユーザーがたとえば 15 分間非アクティブな場合、セッションの有効期限が切れた後にユーザーがアプリケーションを使用しようとしている場合は、ユーザーをログアウトしてログイン ページにリダイレクトする必要があります。
  3. そのため、「 JSF ログアウトとリダイレクト」で提案されているように、セッションの期限切れ状態をチェックし、セッションが期限切れになった場合にユーザーを 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.

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

4

5 に答える 5

14

次のアプローチは私にとってはうまくいきます。これを機能させるには、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>
于 2009-08-24T21:31:44.807 に答える
3

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

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

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

于 2010-10-29T07:17:03.863 に答える
1

Restore ビューの 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 に登録する

于 2011-06-27T21:22:19.757 に答える
0

そのためのフィルターを作成しようとしましたが、うまくいかなかったので、別のフィルターを作成しました。

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

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

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

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

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();
        }
} 

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

于 2011-10-13T12:21:12.083 に答える
0

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

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

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

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

于 2009-08-24T20:22:53.590 に答える