Richfaces / JSF получают атрибуты / параметры страницы в PhaseListener - PullRequest
0 голосов
/ 21 февраля 2019

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

...