2023年4月21日 星期五

sevlet的filter繼承版本及使用規則

繼承版本

早期是繼承 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>

 

沒有留言: