“ HttpServletResponse已提交”是什么意思?

Akk*_*rek 6 java spring servlets httprequest

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

我有一些请求拦截器,扩展HandlerInterceptorAdapter,覆盖了postHandle方法。后处理方法采用parameter final HttpServletResponse response。在方法主体中有一条if语句检查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();
        }
    }
Run Code Online (Sandbox Code Playgroud)

vto*_*tor 6

ServlerResponse.isCommited() 检查响应是否已经提交给客户端(意味着已打开Servlet输出流以写入响应内容)。

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

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

更新:我看到您正在使用Spring控制器。这里的故事有些不同。

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