您好我无法在Wicket 6中解决以下问题。*:
在我们的webapp中,我们使用wicket-auth-roles来管理身份验证/授权。会话过期时,应将用户重定向到getApplicationSettings().setPageExpiredErrorPage(SomePage.class)
下一次操作设置的页面。但是,如果用户尝试访问不允许访客的页面,则会将其重定向到完全跳过PageExpiredPage的登录页面。
我的问题是 - 如何显示"会话已过期。"消息给用户?
除此之外,我在会话生命周期的session.info("message")
阶段尝试了onInvalidate
,然后在登录后(不在登录页面上)在第一页上呈现反馈消息
谢谢你的导师。
答案 0 :(得分:1)
您可以使用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")
}
答案 1 :(得分:1)
在bernie让我走上正确的道路之后,我最终想出了解决问题的方法:
首先需要覆盖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());