Я решил перезагрузить страницу, используя следующий подход.
Phase listener
для фазы RENDER_RESPONSE
создано NavigateHomePage
.
На каждой странице, требующей перезагрузки браузера, необходимо перейти на «Домашнюю страницу» и добавить f:phaseListener
с type = "my.NavigateHomePage"
.
NavigateHomePage
в методе afterPhase
определяет имя текущей страницы (из request
path) и сохраняет его в session
.
NavigateHomePage
в методе beforePhase
определяет имя текущей страницы (из request
path), берет имя предыдущей страницы из session
и принимает request method
. Если текущее имя страницы совпадает с именем предыдущей страницы и request method
равно GET
, а текущая страница не является «Домашней страницей», то выполняется перенаправление на «Домашнюю страницу».
Ограничение заключается в том, что для таких страниц (при перезагрузке браузера из которых происходит переход на «Домашнюю страницу») не должно быть ссылок (через GET
) на себя.
Чтобы включить слушателя фазы на страницу, добавьте на страницу следующее:
<f:phaseListener type="my.NavigateHomePage"/>
Phase listener
код следующий:
public class NavigateHomePage implements PhaseListener {
private static final String CURR_PAGE = "currPage";
private static final String HOME_PAGE = "home";
private static final String HOME_PATH = "/my/faces/home.xhtml";
@Override
public void afterPhase(PhaseEvent event) {
FacesContext facesContext = event.getFacesContext();
String currPage = getPageName(facesContext);
facesContext.getExternalContext().getSessionMap().put(CURR_PAGE, currPage);
}
@Override
public void beforePhase(PhaseEvent event) {
//check browser reload and redirect to Main page
FacesContext facesContext = event.getFacesContext();
String requestMethod = ((HttpServletRequest)facesContext.getExternalContext().getRequest()).getMethod();
String currPage = (String) facesContext.getExternalContext().getSessionMap().get(CURR_PAGE);
String newPage = getPageName(facesContext);
if ("GET".equals(requestMethod) && newPage.equals(currPage) && !HOME_PAGE.equals(newPage)) {
try {
facesContext.getExternalContext().redirect(HOME_PATH);
} catch (IOException ex) {
Logger.getLogger(this.getClass()).warn("Can't redirect to Home page", ex);
}
}
}
@Override
public PhaseId getPhaseId() {
return PhaseId.RENDER_RESPONSE;
}
private String getPageName(FacesContext facesContext) {
String pagePath = facesContext.getExternalContext().getRequestServletPath();
String pageName = pagePath.substring(pagePath.lastIndexOf("/") + 1, pagePath.lastIndexOf(".xhtml"));
return pageName;
}
}