Не контролируйте запрос / ответ со стороны просмотра.Сделайте это на стороне контроллера.Используйте фильтр , который вы сопоставляете с шаблоном URL ограниченных страниц, например /app/*
.Управляемые компоненты JSF в рамках сеанса доступны только как атрибуты HttpSession
в фильтре.
@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) res;
HttpSession session = request.getSession(false);
User user = (session != null) ? (User) session.getAttribute("user") : null;
if (user == null || !user.isLoggedIn()) {
response.sendRedirect("index.xhtml"); // No logged-in user found, so redirect to index page.
} else {
chain.doFilter(req, res); // Logged-in user found, so just continue request.
}
}
Причина, по которой это не удается, заключается в том, что представление JSF является частью ответа и что ответ, возможно, уже был зафиксирован.в таком случае.Вы должны были видеть IllegalStateException: response already committed
в журналах сервера в момент вызова <c:redirect>
.