ユーザーを別のページにリダイレクトしたり転送したりしません。したがって、my SessionExpiredExceptionHandler
(extends ExceptionHandlerWrapper
)がViewExireExceptionを処理する場合。ユーザーが同じページに留まり、PrimeFacesダイアログを表示するようにしたい。セッションの有効期限が切れており、ユーザーが再度ログインする必要があることを通知するため(ダイアログベース)。サーブレット3.1関数を使用してユーザーにログイン/ログアウトしBasic/file
、auth-methodを使用してユーザーをさまざまなシステムロールにマップしています。
現在、ビュー/ページは2分後に更新されますが、セッションは無効になりません。これは、ページが更新された2回目、4分後にのみ発生します。
<session-config>
<session-timeout>2</session-timeout>
</session-config>
編集: メタタグによって更新されます:
<meta http-equiv="refresh" content="#{session.maxInactiveInterval}" />
SessionExpiredExceptionHandler
例外が最初に発生したときにセッションオブジェクト(サーブレットログアウト)を無効にするにはどうすればよいですか?また、クライアントでJavaScript(expireDlg.show())を呼び出してPrimeFacesダイアログを表示するにはどうすればよいですか?
私は他のいくつかのスレッドを調べましたが、実行可能な解決策は見つかりませんでした。 セッションタイムアウト
SessionExpiredExceptionHandler
@Override
public void handle() throws FacesException {
for (Iterator<ExceptionQueuedEvent> i = getUnhandledExceptionQueuedEvents().iterator(); i.hasNext();) {
ExceptionQueuedEvent event = i.next();
ExceptionQueuedEventContext context = (ExceptionQueuedEventContext) event.getSource();
Throwable t = context.getException();
if (t instanceof ViewExpiredException) {
ViewExpiredException vee = (ViewExpiredException) t;
FacesContext fc = FacesContext.getCurrentInstance();
Map<String, Object> requestMap = fc.getExternalContext().getRequestMap();
NavigationHandler nav = fc.getApplication().getNavigationHandler();
try {
requestMap.put("currentViewId", vee.getViewId());
nav.handleNavigation(fc, null, "Home");
fc.renderResponse();
} finally {
i.remove();
}
}
}
// At this point, the queue will not contain any ViewExpiredEvents.
// Therefore, let the parent handle them.
getWrapped().handle();
}
web.xml
<exception-type>javax.faces.application.ViewExpiredException</exception-type>
<location>/home.xhtml</location>
</error-page>