Session 使用wicket auth角色时向用户显示过期会话的消息

Session 使用wicket auth角色时向用户显示过期会话的消息,session,wicket,session-timeout,wicket-1.6,Session,Wicket,Session Timeout,Wicket 1.6,您好,我无法解决Wicket 6中的以下问题。*: 在我们的webapp中,我们使用wicket auth角色来管理身份验证/授权。当会话过期时,应将用户重定向到其下一个操作中由getApplicationSettings().setPageExpiredErrorPage(SomePage.class)设置的页面。但是,如果用户试图访问一个不允许访客的页面,他将被重定向到一个登录页面,完全跳过PageExpiredPage 我的问题是-如何向用户显示“会话已过期”消息 除此之外,我在会话生命周

您好,我无法解决Wicket 6中的以下问题。*:

在我们的webapp中,我们使用wicket auth角色来管理身份验证/授权。当会话过期时,应将用户重定向到其下一个操作中由
getApplicationSettings().setPageExpiredErrorPage(SomePage.class)
设置的页面。但是,如果用户试图访问一个不允许访客的页面,他将被重定向到一个登录页面,完全跳过PageExpiredPage

我的问题是-如何向用户显示“会话已过期”消息

除此之外,我在会话生命周期的
onInvalidate
阶段尝试了
session.info(“message”)
,但是在登录后的第一页(而不是登录页)会呈现反馈消息


感谢您的回复。

您可以使用
RequestCycleListener
记录何时抛出
PageExpiredException

public class ExceptionMapperListener extends AbstractRequestCycleListener {

    @Override
    public IRequestHandler onException(RequestCycle cycle, Exception ex) {
        if (ex instanceof PageExpiredException) {
            // Record in session or request cycle
            // OR
            // Create a RenderPageRequestHandler yourself and add a page parameter
            // See DefaultExceptionMapper#internalMap(Exception)
        }
        return null;
    }
}

// In Application#init():
getRequestCycleListeners().add(new ExceptionMapperListener());
原始答案 (保留,因为它仍然可以帮助…)

由于我不使用wicket auth角色,所以我自己没有尝试过,但请尝试使用以下内容覆盖方法
AuthenticatedWebApplication\restartResponseAsignPage()

if (isSessionExpired()) {
    PageParameters params = new PageParameters();
    params.add("showSessionExpired", true);
    throw new RestartResponseAtInterceptPageException(getSignInPageClass(), params);
} else {
    throw new RestartResponseAtInterceptPageException(getSignInPageClass());
}
然后在SignInPageClass中,如果存在
showSessionExpired
页面参数,则显示所需的消息

我不确定您是如何实现
isSessionExpired()
,但您似乎已经介绍了这一部分

或 根据您如何实现
isSessionExpired()
,您可以在SignInPageClass中执行以下操作:

if (sessionExpired()) {
    session.info("message")
}
在让我走上正确的道路后,我最终找到了解决问题的方法:

首先,需要覆盖
RequestCycleListener

public class SessionExpiredListener extends AbstractRequestCycleListener {
  public void onRequestHandlerResolved(RequestCycle cycle, IRequestHandler handler) {
    if (handler instanceof IPageRequestHandler) {
        IPageRequestHandler pageHandler = (IPageRequestHandler) handler;

        HttpServletRequest request = (HttpServletRequest) cycle.getRequest().getContainerRequest();

        //check whether the requested session has expired
        boolean expired = request.getRequestedSessionId() != null && !request.isRequestedSessionIdValid();

        //check whether the requested page can be instantiated with the current session
        boolean authorized = Session.get().getAuthorizationStrategy().isInstantiationAuthorized(pageHandler.getPageClass());

        if (expired && !authorized) {
            throw new PageExpiredException("Session has expired!");
        }

    }
    super.onRequestHandlerResolved(cycle, handler);
  }
}
检查
authorized
可防止会话过期消息在注销或访问未受保护的页面时显示

最后,您必须在
Web应用程序中注册侦听器和
PageRequestHandlerTracker

getRequestCycleListeners().add(new SessionExpiredListener());
getRequestCycleListeners().add(new PageRequestHandlerTracker());

不幸的是,
isSessionExpired()
正是我被卡住的地方。我无法判断当前会话是新会话还是前一个会话在
AuthenticatedWebApplication
类中过期后的新会话。我认为您的更新使我走上了正确的道路。我需要实现
RequestCycleListener
onBeginRequest(requestCycleCycle)
,在这里我可以检查请求的会话有效性。我还需要考虑的唯一问题是如何区分过期会话和故意失效会话(例如,当用户注销时)。将在我解决它后提供更多信息。