簡體   English   中英

Servlet過濾器繼承

[英]Servlet filters inheritance

想象一下,有一天您會遇到兩個servlet過濾器,一個像這樣擴展另一個:

public class MainFilter implements Filter{
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain){
         .... some stuff ...
       chain.doFilter(request, response);
    }
}

public class FilterExtended extends MainFilter{
     public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain){

       // Is the following code mentally ok?
       if(some business condition){
          {    
              super.doFilter(request, response, chain); // we call MainFilter.doFilter(), which as a consequence calls chain.doFilter()
              return;
          }

       chain.doFilter(request, response); // let the request pass through
    }
}

我的問題是,考慮這樣繼承servlet過濾器是否是一個好習慣。 我無法在互聯網上找到與此有關的任何信息。

我個人認為過濾器不應位於某些可怕的類層次結構中,而應分開放置(這對於我的大腦來說更容易理解,並且更容易看到web.xml中附加的過濾器),但是我想知道其他一些知識在進行任何代碼更改之前的意見。

類似於方面,這種抽象對於處理任何類型的跨領域關注點都是有用的。

例如,我可能希望所有過濾器記錄它們正在應用於請求,然后記錄它們傳遞的所有異常,這樣我就可以知道對於任何給定的請求,哪些過濾器已起作用。 在所有過濾器中放入完全相同的日志記錄代碼將違反DRY。 試圖將方面掛鈎到過濾器中將過於復雜。 我不能想到一種比繼承更好的方法來實現該目標。

另一個例子是,我可能有一組僅適用於某些用戶或請求類型的過濾器。 一個具有抽象getUsersToApplyFor()的簡單基本過濾器類將使其非常易於實現。

我不會使用這種方法的是通過繼承設置自定義過濾器鏈。 例如,我不會創建以一種方式修改請求和響應的基類,然后再創建以另一種方式另外修改請求和響應的子類,而這兩種修改彼此無關。 正如您所指出的那樣,最好將它留在web.xml中,對於將來的開發人員來說更清楚。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM