您好,我一直无法解决 Wicket 6 中的以下问题。*:
在我们的网络应用程序中,我们使用 wicket-auth-roles 来管理身份验证/授权。当 session 过期时,用户应该被重定向到由 getApplicationSettings().setPageExpiredErrorPage(SomePage.class)
为他的下一步操作设置的页面。但是,如果用户尝试访问不允许访客访问的页面,他将被重定向到一个登录页面,完全跳过 PageExpiredPage。
我的问题是 - 如何显示“ session 已过期”。给用户的消息?
除其他事项外,我在 session 生命周期的 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-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")
}
关于session - 使用 wicket-auth-roles 时在 session 过期时向用户显示消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22614003/