【问题标题】:Handle session time out with Wicket使用 Wicket 处理会话超时
【发布时间】:2020-04-27 10:57:18
【问题描述】:

我正在处理一个 wicket 遗留项目,我正在尝试修复会话超时的错误。 基本上我想在会话超时后重定向到自定义错误页面。 这就是我所做的:

web.xml:

  <session-config>
        <session-timeout>1</session-timeout>
    </session-config>

在应用程序类中:

@Override
    public void init() {
        super.init();
        getApplicationSettings().setPageExpiredErrorPage(ErrorMessagePage.class);

这不起作用。我的意思是会话超时后,什么也没有发生。 我做错了什么?


编辑 04.05.20

根据 Martin 的反馈,我尝试实现会话验证检查器:

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】:

    您误将页面过期与会话过期。 有状态页面存储在 PageStore(磁盘)中,并且存储可能会增长到某个预定义的大小。一旦达到这个大小,最旧的页面就会被删除,以便为最新的页面腾出空间。 如果您的用户在某个时候多次使用浏览器的后退按钮,Wicket 将为已删除的页面抛出 PageExpiredException。

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

    如果没有适当的身份验证,Wicket 将创建请求页面的新实例并呈现它。您可以通过将 PageSettings#recreateBookmarkablePagesAfterExpiry 更改为 false 来更改此设置 (见https://github.com/apache/wicket/blob/79f63f66eb588a5d69e9feff7066f1244f61f387/wicket-core/src/main/java/org/apache/wicket/settings/PageSettings.java#L46

    您可以使用 javax/servlet/http/HttpServletRequest.html#isRequestedSessionIdValid() 方法来查找请求是否带有过期的 JSESSIONID cookie/url。如果为 false,则 Web 服务器刚刚创建了一个新的 HttpSession。您可以在 Wicket 的 IRequestCycleListener#onBeginRequest() 中进行检查

    【讨论】:

    • 感谢您的回答。但是,如果在会话超时后,我希望用户不被重定向到登录页面,而是让我们说一个自定义的过期页面。我应该使用哪种方法?如何对此进行控制?
    • 您可以使用 javax/servlet/http/HttpServletRequest.html#isRequestedSessionIdValid() 方法来查找请求是否带有过期的 JSESSIONID cookie/url。如果是false,那么 Web 服务器刚刚创建了一个新的 HttpSession。您可以在 Wicket 的 IRequestCycleListener#onBeginRequest() 中进行检查
    • 嗨,马丁,你能看看我的编辑吗?
    猜你喜欢
    • 2011-04-17
    • 1970-01-01
    • 1970-01-01
    • 2013-01-21
    • 2012-09-16
    • 2014-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多