Richfaces/JSF получают атрибуты/параметры страницы в PhaseListener

Я пытаюсь получить параметры страницы для проверки в 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 всегда равен нулю.

После этого небольшого контекста:

Мне нужно настроить параметр на страницах, который я могу восстановить и использовать до того, как страница будет зафиксирована, чтобы иметь возможность перенаправить, если пользователь не может получить доступ к этой странице.

Как этого добиться?

Изменить1:

Я тестировал с:

<c:set var = "userCase" value = "229501" scope = "request" />

Но возникает та же проблема, эта переменная доступна только после того, как страница уже зафиксирована.

Изменить2:

Я не могу просто использовать FACELETS_BUFFER_SIZE, так как это приложение довольно большое, и проблема с памятью сервера.


person Fabrício R.    schedule 21.02.2019    source источник