繼承版本
早期是繼承 interface的 javax.servlet.Filter
servlet 4.0規格
是建議繼承 abstract class的javax.servlet.http.HttpFilter
兩種Filter基本建立規則一樣
(2023/04/21 Eclipse 在自動建servlet 4.0的filter時,有點小錯,
會同時繼承 javax.servlet.Filter,javax.servlet.http.HttpFilter
實際繼承一個就可)
使用規則
使用web.xml紀錄filter,依照filter定義在web.xml順序執行filter chain
使用annation則依照filter class的class name編碼順序執行
如AFilter.class,BFilter.class,CFilter.class順序執行
(2023/04/21 web.xml及annotation同時存在,竟然執行兩次,web.xml先執行
在執行annotaion設定的Filter,但不知是bug,還是規範如此)
Filter 每一個是各自獨立,故Filter chain必須做到無相依
例思考問題:壓縮Filter及浮水印Filter有先後必須完成順序
但Filter各自獨立,也沒有一定執行規則順序?
Servlet 2.4規格定義了<dispatcher>標籤
<filter>
<display-name>AFilter</display-name>
<filter-name>AFilter</filter-name>
<filter-class>com.lccnet.AFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>AFilter</filter-name>
<url-pattern>/*</url-pattern><!-- url-pattern 與 單一servlet-name二選一 -->
<dispatcher>REQUEST</dispatcher><!-- 沒dispatcher預設 REQUEST -->
<dispatcher>INCLUDE</dispatcher><!-- dispatcher只能最多四個 -->
<dispatcher>FORWARD</dispatcher>
<dispatcher>ERROR</dispatcher>
</filter-mapping>