Я пытаюсь получить параметры страницы для некоторой проверки в PhaseListener.До настоящего времени это решение работало, но получало несколько отчетов об ошибках.
В файле подкачки (.xhtml) у меня есть это:
<ui:param name="userCase" value="229501"/>
И PhaseListener, который запускается ПОСЛЕ любой фазыи получите этот параметр, проведите некоторые проверки безопасности и перенаправьте на страницу с ошибкой:
FaceletContext faceletContext = (FaceletContext) FacesContext.getAttributes().get(FaceletContext.FACELET_CONTEXT_KEY);
if (faceletContext != null) {
String userCase = (String) faceletContext.getAttribute("userCase");
// check permission
if (!hasPermission(userCase)) {
// redirect
NavigationHandler nh = facesContext.getApplication().getNavigationHandler();
nh.handleNavigation(facesContext, null, url);
facesContext.renderResponse();
}
}
Перенаправление не работает и получено исключение IllegalStateException.
В ходе некоторых исследований я нашел этот вопрос:
Пользовательский обработчик исключений JSF 2.0 создает исключение IllegalStateException для handleNavigation
И мне удается настроить этот параметр.
<context-param>
<param-name>javax.faces.FACELETS_BUFFER_SIZE</param-name>
<param-value>65535</param-value><!-- 64KB -->
</context-param>
Итак, я определилчто моя проблема с уже зафиксированными страницами.
Я пытался проверить это ДО фазы, но теперь я не могу получить параметр, так как FaceletContext всегда нулевой.
Послеэтот небольшой контекст:
Мне нужно настроить параметр на страницах, который я могу восстановить и использовать до того, как страница будет зафиксирована, чтобы иметь возможность перенаправления, если пользователь не может получить доступ к этой странице.
Как мне этого добиться?
Edit1:
Я проверял с:
<c:set var = "userCase" value = "229501" scope = "request" />
Но возникает та же проблема, эта переменная доступна только после того, как страница уже зафиксирована.
Edit2:
Я не могу просто использовать FACELETS_BUFFER_SIZE, так как это приложение довольно большое, и память сервера является проблемой.