Servlet过滤继承

时间:2014-01-22 11:55:25

标签: java java-ee inheritance servlet-filters

想象一下,有一天你会遇到两个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中附带的过滤器),但我想在进行任何代码更改之前,请先了解其他一些意见。

1 个答案:

答案 0 :(得分:0)

这种抽象对于处理任何类型的跨领域问题都很有用,类似于方面。

例如,我可能希望我的所有过滤器都记录它们正在应用于请求,然后记录它们传递的任何异常,以便我可以知道任何给定的请求对哪个过滤器执行了操作。在我的所有过滤器中输入完全相同的日志记录代码将违反DRY。尝试将方面挂钩到过滤器中会过于复杂。我想不出比继承更好的方法来实现这个目标。

另一个例子是我可能有一组过滤器,它们仅适用于某些用户或请求类型。具有抽象getUsersToApplyFor()的简单基本过滤器类将使其易于实现。

我不会使用这种方法是通过继承设置自定义过滤器链。例如,我不会创建一个以一种方式修改请求和响应的基类和一个子类,然后以另一种方式另外修改请求和响应,并且这两个修改彼此无关。正如您所指出的那样,最好留在web.xml中,以便将来的开发人员更清楚。