Использовать Spring Web Flow без состояния на сервере

Я читаю главу Spring Web Flow в книге Pro Spring MVC. К сожалению, нет явной информации, где состояние во время выполнения потока сохраняется. Я предполагаю, что он сохраняется в куче JVM и связан с сеансом.

Теперь HTTP является протоколом без сохранения состояния (REST...), и я хотел бы использовать Spring Web Flow без сохранения состояния на сервере (кроме единственного состояния, что сеанс может быть аутентифицирован).

Одна стратегия состоит в том, чтобы отправлять все параметры всего потока с каждым HTTP-запросом потока (скрытый ввод) и, таким образом, накапливать все необходимые параметры, пока поток не завершится.

Затраты на повторную проверку параметров можно избежать с помощью подписей над уже проверенными параметрами.

Знаете ли вы, возможно ли использовать Spring Web Flow таким образом? Кто-нибудь уже сделал это?

Обновление: почему?

Сохраняющееся состояние является не только нарушением принципов HTTP как протокола без сохранения состояния, но также имеет практические проблемы:

  • Если пользователь просматривает несколько вкладок браузера, это может привести к несовместимому состоянию, состоянию гонки или потере данных.
  • Сохранение состояния на сервере усложняет балансировку нагрузки на нескольких серверах.
  • Тестирование и отладка усложняются, потому что запросы нельзя тестировать или анализировать изолированно, а только в контексте предыдущих запросов.
  • Файлы cookie должны быть включены, чтобы соотносить сеансы серверов с запросами.
  • Сервер должен синхронизировать доступ к состоянию на стороне сервера.
  • URL-адрес запроса, который также зависит от состояния сервера, не содержит всей информации, необходимой для закладки состояния в потоке или для осмысления этого в отчете об ошибке.

Я еще не рассматривал детали Web Flow, но уверен, что можно иметь такой же опыт программирования и при этом сохранять всю информацию в параметрах запроса.

Обновление: теперь я узнал, что у моего запрошенного стиля обработки потока есть имя: Continuations. Термин "продолжение" чаще встречается в функциональном программировании, но, видимо, нередко адаптировать идею к HTTP-взаимодействиям.

1 ответ

Возможно, вам будет интересна проверка моего проекта FSM потока bean-компонентов (restflow): https://github.com/alfonso-presa/restflow

Хотя он и не использует Spring WebFlow, я думаю, что он может помочь ответить на дух вопроса, так как он позволяет реализовать поток, управляемый сервером без сохранения состояния. Я начал этот проект, потому что хотел сделать почти то же самое, что и вы, с помощью Spring WebFlow, но обнаружил, что это невозможно, так как состояние сохраняется в сеансе (а также не встроена сериализация REST/json).

Его основной целью является создание конечного автомата (как это делает WebFlow), но с его состоянием, хранящимся в bean-компоненте, который вы можете сохранить в распределенном хранилище или легко подписать или зашифровать и отправить обратно клиенту в качестве продолжения для следующих запросов.

Я надеюсь, что вы найдете это полезным.

редактировать: я создал демонстрационный проект здесь: https://github.com/alfonso-presa/restflow-spring-web-sample

Другие вопросы по тегам