Можно ли пересылать или перенаправлять из сервлет-фильтра после подтверждения ответа?

Логика состоит в том, что фильтр получает удар, условие не выполняется, поэтому он проходит через цепочку фильтров. После ответ фиксируется, фильтр получает удар, и условие теперь выполняется (атрибут запроса был установлен). Он входит, чтобы выполнить пересылку, но страница никогда не переходит. Я знаю, что это как-то связано с фиксацией ответа, потому что я тестировал другую логику, в которой он пересылается, прежде чем он попадает в цепочку в первый раз, и он успешно пересылается.

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {

    HttpServletRequest httpServletRequest = (HttpServletRequest)request;

    if (some condition equals true) {
        httpServletRequest.getRequestDispatcher("/home.jsp").forward(request, response);
        return;
    } else {
        chain.doFilter(request, response);
    }
}

Пример из моего дескриптора развертывания:

<filter>
    <filter-name>MyFilter</filter-name>
    <filter-class>com.filters.MyFilter</filter-class>
</filter>

<filter-mapping>
    <filter-name>MyFilter</filter-name>
    <url-pattern>*.jsp</url-pattern>
    <dispatcher>REQUEST</dispatcher>  
    <dispatcher>FORWARD</dispatcher> 
</filter-mapping>
7
задан Cœur 27 April 2017 в 18:18
поделиться

1 ответ

Статус "зафиксирован" HttpServletResponse - это способ сказать, были ли заголовки ответа записаны в базовый сокет. В "зафиксированном" ответе была записана (по крайней мере) первая строка. Поскольку первая строка ответа содержит код состояния, из этого следует, что вы не можете изменить код состояния зафиксированного ответа ... и это означает, что уже слишком поздно менять статус на 3xx, чтобы сделать перенаправление. Аналогично, вы не можете сделать локальную переадресацию, потому что вы уже начали отправлять ответ.

16
ответ дан 6 December 2019 в 08:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: