PageExpiredException,迁移到wicket 1.5无法正常工作

时间:2014-08-13 21:58:57

标签: java exception-handling migration wicket wicket-1.5

我正在尝试在会话超时时向我的用户提供服务器特定的错误页面。 为此,我在Application的init方法上配置了错误页面。 但是这件事没有用。

我在1分钟内设置会话tiemout,之后没有任何反应,我查看了日志,但是wicket没有抛出任何PageExpiredException。

当会话超时时,wicket只需将其记录为: 会话未绑定:C061F4F21C41EDF13C66795DAC9EDD02 删除会话中包含id' C061F4F21C41EDF13C66795DAC9EDD02'

的页面数据

这是我的customApplication

中的init方法
protected void init() {
    super.init();

    this.getApplicationSettings().setPageExpiredErrorPage(SessionExpiredPage.class);

    ...
    ...
}

我的SessionExpiredPage.class

public class SessionExpiredPage extends TecnoAccionPage {

    public SessionExpiredPage() {
        this.setOutputMarkupId(true);
        this.add(new Label("title", "Sesión Expirada"));
        CSSLoader.get().appendCssUntil(this, SessionExpiredPage.class);
    }
}

我有一个AbstractRequestCycleListener的自定义实现我覆盖了OnException方法但是,当我的会话到期时,我从未传入" onException"。

谢谢你,最好的问候。

1 个答案:

答案 0 :(得分:0)

由于某种原因,wicket没有抛出PageExpiredException,而它可以重建请求的页面,即使会话已过期。

所以,还有另一种方法可以解决这个问题。 您必须覆盖onRequestHandlerResolved中的AbstractRequestCycleListener方法,以捕获所有传入的请求,并检查传入的会话ID是否过时。

要检查此项,您必须拥有应用中过期会话的列表,并捕获未绑定事件以管理它们。

这将是类似的事情:

public class YourApp extends WebApplication {

    //synchronized list with ids
    private List<String> unboundSessions = new CopyOnWriteArrayList<String>();

    @Override
    protected void init() {
        super.init();

        this.getApplicationSettings().setPageExpiredErrorPage(SessionExpiredPage.class);

        //add request listener
        getRequestCycleListeners().add(new AbstractRequestCycleListener() {
            public void onRequestHandlerResolved(RequestCycle cycle, IRequestHandler handler) {
                if (handler instanceof IPageRequestHandler) {
                    HttpServletRequest request = (HttpServletRequest) cycle.getRequest().getContainerRequest();

                    String sessionId = request.getRequestedSessionId();
                    //check whether the requested session has expired
                    boolean expired = sessionId != null && !request.isRequestedSessionIdValid();

                    //if session is not valid and it was really expired
                    if (expired && unboundSessions.contains(sessionId)) {
                        //then remove it from unbound list
                        unboundSessions.remove(sessionId);
                        //and throw exception
                        throw new PageExpiredException("Expired");
                    }
                }
                super.onRequestHandlerResolved(cycle, handler);
            }
        });
        ...
    }

    //this method called when any session is invalidated, so check your manual invalidating calls (if you ever do them)
    @Override
    public void sessionUnbound(String sessionId) {
        super.sessionUnbound(sessionId);
        if (!unboundSessions.contains(sessionId)) {
            unboundSessions.add(sessionId);
        }
    }
}

未绑定会话列表需要我们知道,该用户的会话确实已过期,因为当用户在重新部署后刚刚打开我们的网站时,我们的监听器中的expired变量也可能是true , 例如。他的会话是从他的cookie中获取的,它可能已经过期,但将他立即重定向到SessionExpiredPage会很奇怪。

它看起来像是一种解决方法,但它应该有效。