Вы можете поддерживать состояние многошагового процесса, используя параметры запроса (если вы используете запросы GET) или скрытые поля (если вы используете запросы POST), или оба (если вы используете POST-then-redirect), чтобы позволить пользователю обнови свой браузер).
Если вы поддерживаете состояние на сервере (например, в БД или memcached), вы можете просто сохранить «ключ транзакции» в параметре запроса или в скрытом поле.
Но будьте осторожны - по моему опыту, такой многоступенчатый процесс можно спроектировать достаточно аккуратно, но его может быть сложно реализовать и поддерживать неудивительный пользовательский опыт. Например, что происходит, когда вы перемещаетесь вперед и назад между этапами? Вы можете разрешить это явно, или пользователь может использовать кнопку «назад», но процесс все равно должен иметь смысл.
EDIT:
В качестве конкретного примера:
- Пользователь нажимает кнопку «Начать многоэтапный процесс», что делает POST-запрос к серверу
- Сервер тогда
- инициализирует состояние для процесса
- дает ему уникальный ключ "А"
- хранит его во временном хранилище (например, memcached)
- перенаправляет пользователя на "/ process / A / step / 1"
- Следующим шагом для процесса будет "/ process / A / step / 2"
- Пользователь на другой вкладке снова нажимает «Начать многоэтапный процесс»
- Сервер делает то же самое, но
- использует уникальный ключ "B"
- перенаправляет на "/ process / B / step / 1"
- Следующим шагом для этого второго процесса будет "/ process / B / step / 2"
- Два процесса теперь имеют независимое состояние на стороне сервера