我正在尝试在会话超时时向我的用户提供服务器特定的错误页面。 为此,我在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"。
谢谢你,最好的问候。
答案 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
会很奇怪。
它看起来像是一种解决方法,但它应该有效。