Состояние просмотра может пережить перенаправление, если указан javax.faces.ViewState.Самое простое на данный момент решение, которое я нашел, - это реализация обработчика навигации.
В Face-config.xml:
<faces-config>
<application>
...
<navigation-handler>com.intersult.jsf.util.RedirectNavigationHandler</navigation-handler>
</application>
...
</faces-config>
Класс Java:
public class RedirectNavigationHandler extends ConfigurableNavigationHandler {
private NavigationHandler parent;
public RedirectNavigationHandler(NavigationHandler parent) {
this.parent = parent;
}
@Override
public void handleNavigation(FacesContext context, String from, String outcome) {
if (!context.getPartialViewContext().isPartialRequest()) {
if (outcome == null)
outcome = context.getViewRoot().getViewId();
if (!outcome.endsWith("?faces-redirect=true"))
outcome += "?faces-redirect=true";
String viewState =
context.getExternalContext().getRequestParameterMap().get(ResponseStateManager.VIEW_STATE_PARAM);
outcome += "&javax.faces.ViewState=" + viewState;
}
parent.handleNavigation(context, from, outcome);
}
}
Этоимеет некоторое влияние: каждый редирект больше не является независимым запросом.Это зависит от состояния просмотра, которое не может быть обязательно восстановлено.Так что имейте запасную стратегию, если срок ее действия истек, например.редирект при исключении просроченного просмотра.