Поведение по умолчанию в FlowHandlerAdapter.defaultHandleException () , "пытается начать новое выполнение завершенного или просроченного потока".
Это похоже на способ WebFlow для обработки этогобыло бы предоставить FlowHandler
с помощью метода handleException () , который проверяет наличие instanceof NoSuchFlowExecutionException
, затем сделать что-то вроде создания URL-адреса перенаправления или поместить что-то в область действия сеанса, которая впоследствии может быть удалена после использования.
Из-за того, что WebFlow использует перенаправления, я не думаю, что какие-либо другие области позволили бы использовать такой флаг или сообщение позже при отображении представления нового потока.
Однако, просто обнаружениеновый сеанс в Interceptor
или даже Filter
может показаться столь же эффективным.Именно это я и сделал в своем предыдущем исследовании этого, как задокументировано в указанной ветке форума.Я просто надеялся на что-то более красивое.
Кроме того, к тому времени, когда начинается новый поток, новый идентификатор сеанса уже был создан, поэтому нет способа первоначально обнаружить это условие из потока.xml.
Логика выборочного фильтра:
if (request.getRequestedSessionId() != null && !request.isRequestedSessionIdValid()) {
log.info("Expired Session ID: " + request.getRequestedSessionId());
response.sendRedirect("sessionExpired");
}
else {
chain.doFilter(request, response);
}
Перехватчик выборки:
public class SessionExpiredInterceptor extends HandlerInterceptorAdapter
{
private String redirectLocation = "sessionExpired";
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
Object handler) throws Exception
{
if (request.getRequestedSessionId() != null && !request.isRequestedSessionIdValid())
{
response.sendRedirect(redirectLocation);
return false;
}
return true;
}
public String getRedirectLocation() {
return redirectLocation;
}
public void setRedirectLocation(String redirectLocation) {
this.redirectLocation = redirectLocation;
}
}