0

我正在使用带有 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,

在此先感谢您的帮助

4

1 回答 1

2

我的问题是会话过期后如何避免 ViewExpired 异常,因为我只想能够重定向到登录页面而不会在这种情况下发生 ViewExpiredException

只需将登录页面指定为ViewExpiredException.

<error-page>
    <exception-type>javax.faces.application.ViewExpiredException</exception-type>
    <location>/login.xhtml</location>
</error-page>

(这假设您已经在 servlet 上映射了面*.xhtml,否则相应地进行更改)

也可以看看:

于 2013-03-14T11:54:48.760 回答