[英]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.