Теперь мы используем двусторонний подход.
Довольно сложный менеджер разговоров обнаруживает неверный идентификатор разговора и предпринимает соответствующие действия. В настоящее время он отвечает на событие после восстановления. Я хотел бы переместить его раньше, но на этом этапе возникают проблемы с определением идентификатора вида. Я написал мост JSF в CDI для передачи событий в CDI. SeamFaces сделал бы то же самое, но оказался слишком тяжелым для нас.
Для обычного GET Conversation Manager перенаправляет на себя без параметра cid, чтобы начать новый диалог. Для обратной передачи возвращается ошибка HTTP 410. Обнаружение мертвого разговора, как указано выше. Мы можем использовать более случайный идентификатор разговора, когда создаем диалоги, чтобы попытаться предотвратить столкновение, если идентификатор используется повторно.
Менеджер беседы также начнет разговор в зависимости от метаданных, которые он хранит о страницах. (Все страницы в / формы / требуют разговора в нашем приложении). При этом он использует перенаправление, чтобы гарантировать, что параметр CID находится везде, где он должен быть. Это может стать ненужным, если я смогу решить проблему получения идентификатора формы до фазы RestoreView.
Мы используем API истории браузера, чтобы удалить cid из окна URL браузера пользователя.