2016-09-27 63 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框架 –