java - "HttpServletResponse is committed"是什么意思?

标签 java spring servlets httprequest

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

我有一些请求拦截器,扩展了 HandlerInterceptorAdapter,覆盖了 postHandle 方法。 Post handle 方法采用参数 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();
        }
    }

最佳答案

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

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

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

更新:我看到您正在使用 Spring Controller 。故事在这里有点不同。

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

关于java - "HttpServletResponse is committed"是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39725888/

相关文章:

java - 如何仅删除选定项目中 netbeans 中的所有断点

java - 如何在 java 中实现 (x pow y),其中 x,y 是双倍的?

java - showOptionDialog 之后将焦点返回到 JTable 内的 JComboBox

java - 如何创建路径 bean

Eclipse:如何将 javax.servlet 包添加到项目中?

java - 为什么Spring MVC会以404响应并报告“在DispatcherServlet中未找到带有URI […]的HTTP请求的映射”?

java - 在一个请求中多次上传到 servlet

java - 如何将字符串参数传递给使用 Apache Commons Exec 启动的可执行文件?

java - Spring FactoryBean 和 Autowiring 不起作用 : expected single matching bean but found 2

java - 如何使用 MockHttpServletRequest 对文件上传进行单元测试?