我不会将我的用户重定向或转发到另一个页面。所以当 my SessionExpiredExceptionHandler
(extends ExceptionHandlerWrapper
) 处理 ViewExireException 时。我希望用户留在同一页面上并显示 PrimeFaces 对话框。用于通知会话已过期并且用户需要再次登录(基于对话框)。我使用 Servlet 3.1 功能来登录/注销用户,并Basic/file
使用 auth-method 将用户映射到不同的系统角色。
现在发生的是视图/页面在 2 分钟后刷新,但会话没有失效。仅在 4 分钟后页面刷新时第二次发生。
<session-config>
<session-timeout>2</session-timeout>
</session-config>
编辑: 由元标记刷新:
<meta http-equiv="refresh" content="#{session.maxInactiveInterval}" />
当异常第一次发生时,如何SessionExpiredExceptionHandler
使会话对象(Servlet 注销)无效,以及如何在客户端调用 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>