Перенаправление с помощью jstl core Redirect - PullRequest
2 голосов
/ 14 сентября 2011

Я хочу, чтобы пользователь был перенаправлен, если значение, которое я проверяю в c:if, оценивается как true. Для перенаправления я использую c:redirect url="url". Но это не перенаправляет меня на страницу. Вот код:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<f:view>
<c:if test="#{user.loggedIn}">
    #{user.loggedIn}
    <c:redirect url="index.xhtml"></c:redirect>
</c:if>

    Hello #{user.name}

    <h:form>
    <h:commandButton value="Logout" action="#{user.logout}" />
    </h:form>
</f:view>

Здесь h представляет JSF Html Taglib, c - ядро ​​tagLib JSTL, f - ядро ​​TagSib JSF.

1 Ответ

2 голосов
/ 14 сентября 2011

Не контролируйте запрос / ответ со стороны просмотра.Сделайте это на стороне контроллера.Используйте фильтр , который вы сопоставляете с шаблоном 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>.

...