2014-09-04 65 views
1

我有我的web應用程序下面的代碼片段:的flush()在rd.include VS rd.forward()

if (request.getParameter("user").equals("luke")||session == null && !(uri.endsWith("html") || uri.endsWith("LoginServlet"))) { 
    System.out.println("<<<----------denied------------->>>>"); 
    pw.println("zzzzzzzzzz"); 
    this.context.log("Unauthorized access request"); 
    pw.flush(); 

    try { 
     Thread.sleep(5000); 
    } catch (InterruptedException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

    //res.sendRedirect("login.html"); 
    req.getRequestDispatcher("login.html").include(request,response); 
} 

當我進(),它拋出IllegalStateException之前使用沖洗(因爲響應在我們調用flush的那一刻發送,之後我們試圖使用forward來重新發送響應),但即使我在rd.include()之前提供了flush之後,代碼也能正常工作。爲什麼不在這裏拋出異常?

TIA

回答

0

forwardinclude有不同的方法,該方法包括讓你的內容添加到響應,你必須在JSP中include tag中,包括方法是類似的,但在服務器中。

forward方法將請求處理轉移到另一個進程(servlet,jsp),並且該進程必須更改響應,這就是爲什麼你得到該異常,在轉發之前不能更改響應。

您可以查看這些方法的文檔here

1

此行爲在Servlet Specification中對於章節9.4中的forward方法和章節9.3中的include方法進行了說明。

javadoc也在一個小細節中解釋了這一點。

HttpServletResponse#getWriter()的Javadoc項規定

呼籲PrintWriterflush()提交的響應。

提交響應意味着寫狀態行和標題並刷新響應主體的任何部分在緩衝區中。

javadoc of forward狀態

轉發來自一個servlet到服務器上的另一個資源(servlet時,JSP 文件或HTML文件)的請求。此方法允許一個servlet對 做一個請求的初步處理,並且另一個資源對 產生響應。

因此,轉發資源必須負責生成和提交響應。如果答覆已經提交,它不能這樣做。

javadoc of include狀態

所包含的servlet不能改變響應狀態代碼或設置 頭;任何嘗試進行更改都將被忽略。

該方法只是將另一個資源的內容寫入響應中。它不能對標題或狀態碼做任何事情。因此,之前或之後的承諾沒有區別。

+0

這是正確的,但刷新提交輸出流的狀態和響應發送到客戶端,那麼爲什麼在包含的情況下,異常不會引發時,通過rd.include()再次發送響應。 – 2014-09-04 19:39:12

+0

@jayendrabhatt它沒有發送_again_。 'include'的內容被添加(附加)到響應**主體**中。 – 2014-09-04 20:21:31

+0

由於我的無知道歉,但當我們試圖使用include追加信息時,響應已經消失(由於flush),那麼頁面如何被包含?請糾正我,如果我錯了 – 2014-09-05 04:29:10