“HttpServletResponse is commited”是什么意思?

2022-09-04 20:36:52

正如标题中所述,HttpServletResponse被提交是什么意思?

我有一些请求拦截器,扩展,覆盖方法。后处理方法采用参数 。在方法体中有一个语句检查 if ,该检查究竟是什么?HandlerInterceptorAdapterpostHandlefinal HttpServletResponse responseifresponse.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();
        }
    }

答案 1

ServlerResponse.isCommited()检查响应是否已提交到客户端(表示 servlet 输出流已打开以写入响应内容)。

提交的响应包含 HTTP 状态和标头,您无法对其进行修改。同样重要的是要注意,在这种情况下,响应内容尚未编写,因为标头和状态在内容本身之前提交。

在像您这样的示例中,需要检查以防止响应已经提交但有人试图修改它的情况,在这种情况下,您将获得一个声明,说明响应已经提交。IllegalStateException

更新:我看到你正在使用弹簧控制器。这里的故事有点不同。

  • 情况 1:如果您在控制器中使用方法或返回 Spring,则会在调用 之前写入并提交响应,这使得以后无法更改响应。也就是说,在这种情况下,语句将始终返回 true,并且您无法修改响应。@ResponseBodyResponseEntitypostHandle()response.isCommited()
  • 案例 2:如果您没有上述注释并且不返回或控制器返回 NULL,则在处理控制器方法后调用拦截器方法,但响应尚未提交。这意味着您可以根据需要修改响应(例如,返回200 OK)。ResponseEntitypostHandle()

答案 2

它是已提交的响应而不是请求。这意味着响应已发送到输出流/客户端。


推荐