Spring webflow: перейти к «следующему» состоянию из состояния принятия решения

Мой сценарий таков: мне нужно реализовать тип проверки авторизации, который будет выполняться в нескольких потоках. Прямо сейчас один из моих потоков выглядит так:

<flow parent="myparent-flow">
    <decision-state id="checkAuthorization">
        <if test="bean.notAuthorized" 
            then="redirectToSomePage"
            else="view1" />
    </decision-state>
    <view-state id="view1" />
    <!-- ... -->
</flow>

Мне нужно реализовать ту же самую проверку авторизации для ряда потоков, и хотя я могу везде копировать-вставлять одну и ту же логику, мне бы очень хотелось, если возможно, поместить это в сам родительский поток, который уже используется для выполнения некоторой логики при запуске каждого потока.

Проблема здесь в другом классе в состоянии принятия решения. Поскольку это родительский поток для многих подпотоков, он не будет знать имя первого состояния в дочернем потоке. Я хотел бы использовать его как таковой, чтобы он как-то продвигался вперед и выполнял следующее состояние в потоке, которое существует в дочернем потоке. Мое оптимальное решение было бы примерно таким:

<flow> <!-- flow name = myparent-flow -->
    <decision-state id="checkAuthorization">
        <if test="bean.notAuthorized"
            then="redirectToSomeFlow"
            else="continueExecutionInChildFlow" />
    </decision-state>
    <end-state id="redirectToSomeFlow" view="flowRedirect:someFlow" />
</flow>

Затем это будет определено как родительский поток во всех моих потоках, чтобы мне не приходилось дублировать эту логику. Можно ли сделать такое с помощью Spring?


person yzfr1    schedule 21.02.2014    source источник
comment
Разве Spring Security не позволяет проверить авторизацию?   -  person Francisco Spaeth    schedule 21.02.2014
comment
Строго говоря, это не авторизация, а скорее перенаправление пользователя на другой портал в зависимости от значения bean-компонента.   -  person yzfr1    schedule 21.02.2014


Ответы (1)


Одним из возможных способов достижения этого может быть установка переменной в конкретном потоке и последующее использование этой переменной для перенаправления конечного состояния, например:

<if test="bean.notAuthorized" 
    then="redirectToSomeFlow" 
    else="${conversationScope.resultView}" />

Переменная может быть установлена ​​с помощью:

<set name="conversationScope.resultView" value="'viewName'" />
person Francisco Spaeth    schedule 21.02.2014