我正在使用带有 Primefaces 3.5 的 Websphere Portal 8。要求是,当会话超时时,用户将被重定向到会话超时页面,该页面上有一个按钮,单击该按钮时会将用户带回登录页面。登录页面和会话超时页面一样包含一个 portlet——两者都在同一个 portlet 应用程序中。我正在使用 ImplicitLogoutFilter 成功重定向到会话超时页面:
@Override
public void logout(HttpServletRequest request, HttpServletResponse response, FilterChainContext filterContext, LogoutFilterChain chain) throws LogoutException, LoginException {
chain.logout(request, response, filterContext);
if (filterContext.getRedirectURL() != null) {
if (logger.isLoggable(Level.FINEST)) {
logger.logp(Level.FINEST, CLASS_NAME, MethodName.LOGOUT, "Redirecting to session timeout page: " + SESSION_TIMEOUT_PAGE_URL);
}
filterContext.setRedirectURL(SESSION_TIMEOUT_PAGE_URL);
}
}
会话超时页面上的 portlet 包含一个按钮,该按钮调用重定向到登录页面的 portlet 操作:
public void navigateToPortalPage(String pageUniqueName) throws RpmPortalException {
final String methodName = "navigateToPortalPage";
RpmPortalPage portalPage = getNavigationManager().getPortalPage(pageUniqueName, getPortletRequest(), getPortletResponse());
try {
FacesContext context = getFacesContext();
if (context != null) {
context.getExternalContext().redirect(portalPage.getUrl());
context.responseComplete();
}
} catch (IOException e) {
RpmExceptionUtils.logAndThrowException(CLASSNAME, methodName + "(" + pageUniqueName + ")", RpmErrorCode.RPM_CONFIG_00004, getLoggedinUser(), e);
}
}
但是,当单击按钮而不是进入登录页面时,会引发 ViewExpired 异常。此异常由异常处理程序处理,该处理程序处理异常、重定向到错误页面并向用户显示错误。
我的问题是如何在会话过期后避免 ViewExpired 异常,因为我只想能够重定向到登录页面而不会在这种情况下发生 ViewExpiredException,
在此先感谢您的帮助