Что означает "совершенный HttpServletResponse"?

Как указано в заголовке, что это значит, что HttpServletResponse зафиксирован?

У меня есть запрос перехватчика, расширяющий HandlerInterceptorAdapter, что отменяет postHandle метод. Метод дескриптора принимает параметр final HttpServletResponse response, В методе body есть if проверка выписки, если response.isCommitted()что именно это проверяет?

private static final String voidResponse = "null";

@Override
    public void postHandle(final HttpServletRequest request, final HttpServletResponse response, final Object handler,
            final ModelAndView modelAndView) throws IOException {
        if (!response.isCommitted()) {
            if (DefaultServletHttpRequestHandler.class == handler.getClass()) {
                return;
            }
            response.setStatus(200);
            response.setCharacterEncoding("UTF-8");
            response.setContentType("application/json");
            try (final Writer writer = response.getWriter()) {
                writer.write(voidResponse);
            }
            log.info("void method called, respond with 200 and null");

            response.flushBuffer();
        }
    }

2 ответа

Решение

ServlerResponse.isCommited() проверяет, был ли ответ уже передан клиенту или нет (означает, что выходной поток сервлета был открыт для записи содержимого ответа).

Подтвержденный ответ содержит статус HTTP и заголовки, и вы не можете изменить его. Также важно отметить, что в этом случае содержимое ответа еще не было написано, так как заголовки и статус фиксируются перед самим содержимым.

В таких примерах, как ваш, проверка необходима для предотвращения ситуаций, когда ответ уже был передан, но кто-то пытается его изменить, и в этом случае вы получите IllegalStateException заявив, что ответ уже был принят.

ОБНОВЛЕНИЕ: Я вижу, что вы используете контроллеры Spring. История немного отличается здесь.

  • Случай 1: если вы используете @ResponseBody в вашем методе контроллера или возвращения ResponseEntity Spring пишет и передает ответ до того, как postHandle() называется, что делает невозможным изменить ответ позже. Что сказано в этом случае response.isCommited() оператор всегда вернет истину, и вы не сможете изменить ответ.
  • Случай 2: если у вас нет вышеупомянутой аннотации и вы не возвращаете ResponseEntity или контроллер возвращает NULL postHandle() метод перехватчика вызывается после обработки метода контроллера, но ответ еще не зафиксирован. Это означает, что вы можете изменить ответ по своему усмотрению (например, вернуть 200 ОК).

Это ответ, совершенный, а не запрос. Это означает, что ответ уже отправлен в выходной поток / клиент.

Другие вопросы по тегам