如标题所述,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 返回 NULLpostHandle()
拦截器的方法在 Controller 方法处理完成后被调用,但是还没有提交响应。这意味着您可以根据需要修改响应(例如返回 200 OK)。
关于java - "HttpServletResponse is committed"是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39725888/