我正在做一个wicket遗留项目,我想修复一个会话超时的错误。基本上,我想在会话超时后重定向到一个自定义的错误页面。我是这样做的。
web.xml:
<session-config>
<session-timeout>1</session-timeout>
</session-config>
在应用程序类中。
@Override
public void init() {
super.init();
getApplicationSettings().setPageExpiredErrorPage(ErrorMessagePage.class);
这是不工作的。我的意思是在会话超时后,什么都没有发生。我到底做错了什么?
EDIT 04.05.20
根据Martin的反馈,我试着实现了一个session validaty检查器。
public class SessionValidityChecker implements IRequestCycleListener {
@Override
public void onBeginRequest(RequestCycle cycle) {
HttpServletRequest request = (HttpServletRequest) cycle.getRequest().getContainerRequest();
boolean sessionValid = request.isRequestedSessionIdValid();
if (!sessionValid) {
cycle.setResponsePage(SessionExpiredPage.class);
}
}
}
并在Application.class中
public void init() {
super.init();
getRequestCycleListeners().add(new SessionValidityChecker());
}
另外,我在第一篇文章中可能应该说明的是,我使用wicket SignInPanel进行自动认证。超时后,我希望用户注销并重定向到一个特定页面。
我用上面的代码试了一下,但会话超时后,没有发生重定向。更糟糕的是,用户仍然是登录的。我到底漏了什么?
你误解了页面过期和会话过期.有状态的页面存储在PageStore(磁盘)中,并且这个存储可以增长到一些预定义的大小。如果用户多次使用浏览器的 "返回 "按钮,Wicket就会在某个时候为被删除的页面抛出PageExpiredException。
在你的情况下,当会话过期时,Web服务器(如Tomcat)通常会创建一个新的会话。如果你的应用启用了身份验证,那么它将检测到新的http会话中没有经过身份验证的用户,很可能会将用户重定向到登录页面。
如果没有启用身份验证,Wicket就会创建一个新的请求页面实例,并进行渲染。你可以通过改变 PageSettings#recreateBookmarkablePagesAfterExpiry
到 false
(见 https:/github.comapachewicketblob79f63f66eb588a5d69e9feff7066f1244f61f387wicket-coresrcmainjavaorgapachewicketsettingsPageSettings.java#L46。)
你可以使用javaxservlethttpHttpServletRequest.html#isRequestedSessionIdValid()方法来查找该请求是否带有过期的JSESSIONID cookieurl。如果是假的,那么Web服务器刚刚创建了一个新的HttpSession。你可以在Wicket的IRequestCycleListener#onBeginRequest()中进行检查。