3

嗨,我无法在 Wicket 6.* 中解决以下问题:

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

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

除其他外,我在会话生命周期的阶段进行了尝试session.info("message")onInvalidate但是反馈消息然后在登录后的第一页上呈现(而不是在登录页面上)。

谢谢你的回答。

4

2 回答 2

1

您可以使用 aRequestCycleListener来记录PageExpiredException抛出 a 的时间。

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-roles,但尝试AuthenticatedWebApplication#restartResponseAtSignInPage()用这样的方法覆盖该方法:

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")
}
于 2014-03-25T15:06:04.230 回答
1

伯尼让我走上正确的道路后,我最终找到了解决问题的方法:

首先需要覆盖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可防止会话过期消息在注销或访问未受保护的页面时显示。

最后,您必须注册您的侦听器并PageRequestHandlerTracker在您的WebApplication

getRequestCycleListeners().add(new SessionExpiredListener());
getRequestCycleListeners().add(new PageRequestHandlerTracker());
于 2014-04-03T10:09:43.843 回答