2016-09-27 79 views
1

正如标题所述,这意味着Http servlet请求是否被提交?http servlet请求被提交,这是什么意思?

我有一些请求拦截器,extednig HandlerInterceptorAdapter,即覆盖postHandle方法。后处理方法需要参数final HttpServletRequest 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(); 
     } 
    } 

编辑:我当然彪HttpServletRequest response,坏拷贝磷酸酶 EDIT2:添加的代码

回答

1

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

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

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

UPDATE:我看到您使用的是Spring控制器。这里的故事有点不同。

  • 案例1:如果你在你的控制器使用方法或@ResponseBody返回ResponseEntity春写入并提交postHandle()在响应被称为,这使得它不可能再更改响应。也就是说在这种情况下,response.isCommited()语句将始终返回true,并且您无法修改响应。
  • 案例2:如果您没有上述标注和不返回ResponseEntity或控制器返回NULL拦截的postHandle()方法控制方法已被处理之后被调用,但反应未提交然而。这意味着您可以根据需要修改响应(例如,返回200 OK)。
+0

这个拦截器的意义在于当客户端调用一个void方法或当调用的方法返回null而不是来自方法签名的对象时修改响应,在这种情况下它将响应状态修改为200,并返回带有“null”的json。我将用方法体来编辑帖子以显示我的意思。 –

+0

@AkkaJaworek我已经更新了我的答案,请检查。它解释了你的问题。希望有所帮助。 – vtor

+0

谢谢,thios几乎是这样,我有控制器方法返回''ResponseEntity''然而在某些情况下,它可以返回null。如果我在这种情况下正确理解你,它会是:''Response ResponseEntity;''< - 响应被粉碎; ''返回null;''<-response没有被提交。无效方法也属于情况2,因为它们不会返回ResponseEntity,对吗? –

1

响应致力于请求。这意味着响应已经发送输出流/客户端。

+0

当然我补充反应,不好的复制粘贴,但是这与控制器端点返回的内容有什么关系?从控制器返回“null”时测试的结果来看,响应没有被提交,并且当它从方法签名返回类型对象时,响应已经被提交,这是否总是如此(当端点返回null - >响应没有被提交)? –

+0

这不应该是一个案例。不知道你称为控制器是什么,但是它取决于你使用的servlet/framework提交响应,以及它如何将请求委托给拦截器。返回的响应内容可以是NULL,并且响应仍然有效(因为您可能会看到状态码)。 – vtor

+0

这个拦截器的目的是拦截所有对控制器void方法的调用,并且由于void方法本身不返回任何东西,所以这应该修改响应以返回包含“null”的json的状态200。同样的规则应该适用于返回null的方法。据我测试这个解决方案的作品,但是我想明白为什么。顺便说一句。它的Spring框架 –