“HttpServletResponse承诺”是什么意思?

时间:2016-09-27 13:25:31

标签: java spring servlets httprequest

如标题所述,提交HttpServletResponse意味着什么?

我有一些请求拦截器,扩展HandlerInterceptorAdapter,覆盖postHandle方法。 Post句柄方法采用参数final HttpServletResponse response。在方法体中有一个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 个答案:

答案 0 :(得分:4)

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

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

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

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

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

答案 1 :(得分:1)

响应已提交请求。这意味着响应已经发送到输出流/客户端。