срок действия веб-страницы истек при нажатии кнопки «Назад» при отправке JSF (Richfaces) - PullRequest
0 голосов
/ 05 июля 2010

Мой заголовок может сбивать с толку, поэтому, пожалуйста, продолжайте читать. Я использую следующие технологии, если вы можете. Spring, Hibernate, JSF (RichFaces), MySQL, Internet Explorer.

У меня есть список элементов, который отображается в виде данных RichFaces примерно так:

item a
item b
item c
item d
item e

На этой же странице у меня есть следующие кнопки: поиск, редактирование, добавление, удаление и новый .

Когда пользователь вводит строку поиска, например, «элемент c» и нажмите кнопку поиска, после чего отобразится список подходящих элементов, например:

item c

Когда пользователь нажимает кнопку new , запрос будет перенаправлен на другую страницу с помощью:

FacesContext facesContext = FacesContext.getCurrentInstance();
facesContext.getExternalContext().redirect(page + ".jsf" );

Когда на этой странице нажимается кнопка возврата браузера IE, на странице отображается сообщение «веб-страница устарела». Что это такое и как мне этого избежать?

1 Ответ

3 голосов
/ 05 июля 2010

срок действия веб-страницы истек

Вы получите эту ошибку при попытке получить не кэшированный POST-запрос из истории браузера. Такое поведение вполне ожидаемо. Чтобы устранить эту «проблему», вам нужно либо включить кеш, либо заменить POST на GET.

Включение кэша браузера на самом деле просто: просто удалите Cache-Control: no-cache и связанные с ним заголовки из ответа HTTP соответствующего запроса POST. После этого конечный пользователь получит только диалоговое окно с предупреждением о том, что данные POST будут повторно отправлены на сервер, что в случае полностью неидемпотентных запросов, таких как размещение заказа или удаление элемента, действительно нежелательно. Замена POST на GET - лучшее решение. Получение результатов поиска (как, например, Google) должно быть сделано GET.

Заменить POST на GET было нелегко в JSF до версии 2.0. Лучшее, что вы можете сделать - это запустить перенаправление после POST и передать интересующие данные в качестве параметра запроса, который вы сохраняете из #{param} в качестве управляемого свойства (более рекомендуется), или сохранить интересующие данные в области сеанса (не рекомендуется). Совершенно другая альтернатива - заменить JSF <h:form> простым HTML <form action="searchresults.jsf"> и выполнить поиск в методе @PostConstruct в компоненте поддержки, связанном с searchresults.jsf, после того, как отправленный запрос будет собран как управляемое свойство. или из карты параметров запроса.

...