Для этого вам следует использовать Filter
.
1008 * Е.Г. *
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException {
if (((HttpServletRequest) request).getSession().getAttribute("user") == null) {
((HttpServletResponse) response).sendRedirect("error.jsf"); // Not logged in, so redirect to error page.
} else {
chain.doFilter(request, response); // Logged in, so just continue.
}
}
Здесь я предполагаю, что User
помещен в область видимости сеанса, как вы обычно ожидаете. Это может быть управляемый компонент JSF в рамках сеанса с именем user
.
Правило навигации не применимо, поскольку во время обычного запроса GET
средства «действия компонента» отсутствуют. Кроме того, перенаправление, когда управляемый bean-компонент собирается быть готовым к работе, потому что, когда управляемый bean-компонент создается во время обычного запроса GET
, ответ уже начал отображаться, и это точка 1017 * нет возврата (это даст только IllegalStateException: response already committed
). PhaseListener громоздок и подавляющим, так как вам на самом деле не нужно слушать на любой из фаз JSF. Вы просто хотите прослушать «простые» HTTP-запросы и наличие определенного объекта в области сеанса. Для этого идеально подходит Фильтр.