2012-03-08 2 views
0

ViewExpiredExceptionを持つWebsphere Process Server(WAS 7の上)にJSFページがあります。ViewExpiredExceptionのためログアウトした後に2回ログインする必要があります

、ログインにリダイレクト
<% 
    session.invalidate(); 
    response.sendRedirect("ibm_security_logout?logoutExitPage=/faces/ToDosOpen.jsp"); 
%> 

:この問題が発生したとき、私は、ユーザーがログアウトしてから、私は、次のログアウトページにweb.xmlにこの例外にリダイレクトを設定している にバックログに記録しますページ:

<%@ page import="com.ibm.wbit.tel.client.jsf.infrastructure.Messages, java.util.Locale" language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> 
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 
<% 
    String contextPath = request.getContextPath(); 
    Locale locale = request.getLocale(); 
    final String SECURITY_CHECK = "j_security_check"; 
%> 

... 
</head> 

<body> 
... 

<h1><%= Messages.getString("LOGIN_LINE", locale) %></h1> 

<div class="help-text"><%= Messages.getString("LOGIN_LINE_DESCR", locale) %></div> 

<form target="_top" method="POST" action=<%= SECURITY_CHECK %>> 
    <table id="login-form"> 
     <tr> 
      <td><%= Messages.getString("LOGIN_NAME", locale) %>:</td> 
      <td><input type="text" name="j_username"></td> 
     </tr> 
     <tr> 
      <td><%= Messages.getString("LOGIN_PASSWORD", locale) %>:</td> 
      <td><input type="password" name="j_password"></td> 
     </tr> 
     <tr> 
      <td id="login-button" colspan="2"> 
<input type="submit" name="login" value=" 
<%= Messages.getString("BUTTON_LOGIN", locale) %>"></td> 
      </tr> 
    </table> 

</form> 

ログインすると、最初に例外が発生したページにリダイレクトされます。実際に何が起こるかを除き、例外が再びスローされ、ログインページに戻ります。

これで2回ログインする必要があります。

これについての対処方法や見た目の開始位置が不明です。どんな助けもありがとう。 私はこれに関する既存の質問を見てきましたが、解決できませんでした。


編集:私は、これは例外をトリガしたアクションがリフレッシュした場合は正常に動作しますが、アクションはコマンドバーをクリックした場合(2回ログインする必要が)失敗したことを言及するのを忘れました。

答えて

0

最後に、次のViewHandlerを使用して解決しました。 これは基本的に期限切れのビューを再作成します。 POSTパラメータがあった場合、それらは明らかに失われているので、特別な処理を必要とせずに作成できないビューは特別な処理を必要とします。

これは、この問題に遭遇する他の人にとっても役に立ちます。私が100%自信を持っているわけではないので、この解決策に間違いがある場合はお知らせください。

/** 
* This class just handles cases where the session expired 
* which causes an exception on reload. 
*/ 
public class ViewExpiredHandler extends ViewHandlerWrapper { 

private ViewHandler wrapped; 

public ViewExpiredHandler(ViewHandler wrapped) { 
    this.wrapped = wrapped; 
} 

@Override 
public UIViewRoot restoreView(FacesContext ctx, String viewId) 
{ 
    UIViewRoot viewRoot = super.restoreView(ctx, viewId); 
    try { 
     if (viewRoot == null) { 

      viewRoot = super.createView(ctx, viewId); 
      ctx.setViewRoot(viewRoot); 

     } 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    return viewRoot; 
} 

@Override 
protected ViewHandler getWrapped() { 
    return wrapped; 
} 
} 
+0

だから私はちょうどViewExpiredExceptionをキャッチして、正しいコンテキストとビューIDを渡すrestoreViewメソッドを呼び出す必要がありますか?またはそれを使用する特別な場所がありますか? – rsb2097

+1

私の解決策は、ViewExpiredExceptionのためのViewHandlerを作成し、そこでrestoreViewを呼び出すことでした。それはそれを使用する特別な場所です。 "restoreView"メソッドはViewHandler自体からのものです( "super"に気付く)ので、ビューハンドラ以外でどこから呼び出すことができるかわかりません。 JSFライフサイクルのすべての段階でこれを実行することはできませんが、具体的にどの段階でこれを許可しているかはわかりません。ハンドラは、フェーズが良好であるようにリストアビューフェーズで呼び出され、他のフェーズは実行されません。 –

+0

それを試みるつもりです。ありがとう! – rsb2097

関連する問題