Что означает "совершенный 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
или контроллер возвращает NULLpostHandle()
метод перехватчика вызывается после обработки метода контроллера, но ответ еще не зафиксирован. Это означает, что вы можете изменить ответ по своему усмотрению (например, вернуть 200 ОК).
Это ответ, совершенный, а не запрос. Это означает, что ответ уже отправлен в выходной поток / клиент.