Я пытаюсь получить параметры страницы для проверки в 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.
Проведя некоторое исследование, я нашел этот вопрос:
И мне удалось настроить этот параметр.
<context-param>
<param-name>javax.faces.FACELETS_BUFFER_SIZE</param-name>
<param-value>65535</param-value><!-- 64KB -->
</context-param>
Итак, теперь я определил, что моя проблема связана с уже зафиксированными страницами.
Я пытался проверить это ДО фазы, но теперь я не могу получить параметр, так как FaceletContext всегда равен нулю.
После этого небольшого контекста:
Мне нужно настроить параметр на страницах, который я могу восстановить и использовать до того, как страница будет зафиксирована, чтобы иметь возможность перенаправить, если пользователь не может получить доступ к этой странице.
Как этого добиться?
Изменить1:
Я тестировал с:
<c:set var = "userCase" value = "229501" scope = "request" />
Но возникает та же проблема, эта переменная доступна только после того, как страница уже зафиксирована.
Изменить2:
Я не могу просто использовать FACELETS_BUFFER_SIZE, так как это приложение довольно большое, и проблема с памятью сервера.