2009-08-24 70 views
20

javax.servlet.Filter對象可以用於身份驗證(在過濾器需要在需要完成任何servlet工作之前捕獲請求)以及用於XSLT轉換(其中servlet需要完全生成內容)。它何時實際執行?DoFilter()在Servlet的工作完成之前還是之後執行?

我知道這是依賴於實現(在Web容器上),但這似乎是需要由所有人解決的問題。

也許有一個配置選項設置在每個過濾器註冊的Web容器?

附加:

此外,什麼支配濾波執行的順序?爲什麼FooFilter會在BarFilter之前執行?

+0

濾波器執行的順序可以在web.xml文件中提供執行-mapping>。容器將使用提供的過濾器從上到下攔截程序的工作流程。 – 2013-10-04 08:03:55

回答

43

過濾器鏈本質上包裝了servlet調用。鏈將處理所有鏈接,直到它遇到「底部」,然後允許servlet運行,然後反向返回鏈。例如,如果你有一個新的「示例過濾器」,你的doFilter()方法可能如下:

public void doFilter(ServletRequest request, 
     ServletResponse response, FilterChain chain) 
     throws IOException, ServletException { 
// do pre-servlet work here 
chain.doFilter(request, response); 
// do post servlet work here 

} 
+0

這可能有點做作,但如果我想拒絕迴應呢?換句話說,我想停止實際響應的響應?這是可以拋出ServletException的地方嗎? – 2009-08-24 15:33:21

+1

拋出一個ServletException仍然會返回一個「響應」給客戶端,所以它將取決於你沒有返回響應的意思。你可以創建一個新的響應對象,只有你指定的內容並返回,如果你願意的話。 – 2009-08-24 16:19:03

+0

啊好點。絕對沒有任何迴應是不可取的。即使doFilter()在調用chain.doFilter()之前返回,它仍然會返回一些其他錯誤頁面或默認值或其他值。 – 2009-08-24 16:22:39

0

@Rich:是的doFilter()之前或Servlet的工作完成後執行?

過濾器是它所關聯的servlet或JSP頁面與 之前在服務器 上運行的程序。

+0

引用來自哪裏? – 2009-08-24 15:44:45

+0

它看起來是由Marty Hall引用的「更多Servlet和JavaServer Pages」引用的。 – 2009-08-24 16:01:59

+0

@adatapost因爲它包裝了調用,它將在servlet/jsp之前被調用,但在處理後會重新獲得控制權(如果另一個過濾器沒有中斷處理) – 2009-08-24 16:17:39

7

alt text http://img228.imageshack.us/img228/8945/filter.png

關於順序:當我從規範servlet容器記得不保證過濾器會以某種順序被調用。

+2

「按照過濾器映射出現的順序調用過濾器在WAR的過濾器映射列表中,您可以在其部署描述符中爲WAR指定一個過濾器映射列表,用於使用XML手動編寫該列表。「參考:http://docs.oracle.com/javaee/6/tutorial/doc /bnagb.html – 2013-12-05 05:54:08

+3

您的圖片鏈接已損壞。 – Bob 2014-07-23 02:32:53

-1

按照以及servlet2.3規範濾波器是使用<濾波器根據濾波器 - 映射序列的web.xml配置REF- http://www.programering.com/a/MTMyADOwATI.html

+0

儘管這在理論上可以回答這個問題,但[這將是更可取的](// meta.stackoverflow.com/q/8259)在這裏包含答案的基本部分,並提供了供參考的鏈接。 – 2015-09-29 07:07:33

相關問題