Изящно обрабатывать просроченный HttpSession в Spring WebFlow - PullRequest
6 голосов
/ 28 марта 2012

(из SpringSource forum .)

Когда срок действия HttpSession истек и пользователь повторно отправляет страницу в потоке, он / она отправляется обратно в началопоток.Все, что я хочу добавить к этому поведению, это сообщение, объясняющее, почему это произошло.«Вы были неактивны, поэтому вас перезапустили ...»

Какой самый простой / лучший способ сделать это?

Ответы [ 3 ]

4 голосов
/ 28 марта 2012

Поведение по умолчанию в 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;
    }
}
1 голос
/ 16 мая 2018

С запрос Jira, который я открыл , говорит разработчик WebFlow,

Custom FlowHandler - точка расширения для сеанса с истекшим сроком действия.Вы можете перенаправить в поток и добавить параметр запроса, например, restarted = true, а затем в потоке объявить <input name="restarted" type="boolean" value="flashScope.restarted" />.

Я не смог подтвердить, но хотелподелиться информацией.

1 голос
/ 14 октября 2014

Шаг 1: FlowController имеет обработчик по умолчанию Adapter. Чтобы настроить исключения сеанса, вы должны написать свой собственный адаптер обработчика и зарегистрировать его в bean-компоненте контроллера потока, как показано ниже:

<bean id="flowController" class="org.springframework.webflow.mvc.servlet.FlowController">
.
.<property name="flowHandlerAdapter" ref="customFlowHandlerAdapter"/>

.
</bean>

<bean id="customFlowHandlerAdapter" class="gov.mo.courts.pbw.adapters.CustomFlowHandlerAdapter"
     p:flowExecutor-ref="flowExecutor"/>

Шаг 2: CustomFlowHandlerAdapter В этом классе переопределите метод defaultHandleException. это метод, который веб-поток вызывает в случае исключений и повторно инициализирует сеанс. пожалуйста, обратите внимание, новая сессия уже была создана до этого момента. Только тип исключения сообщит вам, что время предыдущего сеанса истекло.

public class PbwFlowHandlerAdapter extends FlowHandlerAdapter{
protected void defaultHandleException(String flowId, FlowException e,
            HttpServletRequest request, HttpServletResponse response)
            throws IOException {
        if(e instanceof NoSuchFlowExecutionException){
            if(e.getCause() instanceof NoSuchConversationException){
                //"use newly created session object within request object to save your   customized message."
            }
        }
        super.defaultHandleException(flowId, e, request, response);
    }

На первой странице просмотра вашего приложения должно отображаться это сообщение.

<%
                        if (session.getAttribute(YOUR_CUSTOM_MSG_KEY) != null) {
                    %>
                    <p class="errormessage">
                    <%=session.getAttribute(YOUR_CUSTOM_MSG_KEY)%>
                    </p>
                    <%
                    //once the message has been shown, remove it from the session
                    //as a new session has already been started at this time
                        session.removeAttribute(YOUR_CUSTOM_MSG_KEY);
                            }
                    %>

Надеюсь, это поможет.

...