与Wicket一起处理会话时间

问题描述 投票:1回答:1

我正在做一个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进行自动认证。超时后,我希望用户注销并重定向到一个特定页面。

我用上面的代码试了一下,但会话超时后,没有发生重定向。更糟糕的是,用户仍然是登录的。我到底漏了什么?

wicket
1个回答
4
投票

你误解了页面过期和会话过期.有状态的页面存储在PageStore(磁盘)中,并且这个存储可以增长到一些预定义的大小。如果用户多次使用浏览器的 "返回 "按钮,Wicket就会在某个时候为被删除的页面抛出PageExpiredException。

在你的情况下,当会话过期时,Web服务器(如Tomcat)通常会创建一个新的会话。如果你的应用启用了身份验证,那么它将检测到新的http会话中没有经过身份验证的用户,很可能会将用户重定向到登录页面。

如果没有启用身份验证,Wicket就会创建一个新的请求页面实例,并进行渲染。你可以通过改变 PageSettings#recreateBookmarkablePagesAfterExpiryfalse(见 https:/github.comapachewicketblob79f63f66eb588a5d69e9feff7066f1244f61f387wicket-coresrcmainjavaorgapachewicketsettingsPageSettings.java#L46。)

你可以使用javaxservlethttpHttpServletRequest.html#isRequestedSessionIdValid()方法来查找该请求是否带有过期的JSESSIONID cookieurl。如果是假的,那么Web服务器刚刚创建了一个新的HttpSession。你可以在Wicket的IRequestCycleListener#onBeginRequest()中进行检查。

© www.soinside.com 2019 - 2024. All rights reserved.