2014-01-22 56 views
0

想象一下,有一天你会来跨两个Servlet过滤器,一个延伸,就像这样: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中附加的过滤器),但是我想在做任何代码更改之前了解一些其他意见。

+0

要征求意见有可能会让您得到很长的答案,但无论如何都不能真正解决您的问题。请考虑改写你的问题,使其更具体。另外,请分享你自己的优点和缺点。 – Bex

+0

为什么你认为过滤器的继承是错误的?他们是正常的班级。没有魔法。您应该确保的唯一事情是如何从父类处理配置注释。但在你的上面的例子中,你不要通过注释来使用配置。 –

回答

0

那种抽象的将是处理任何类型的交叉问题,类似的多个方面。

例如,我可能希望我所有的过滤器来记录他们被应用到该请求,然后日志通过了他们,这样我可以知道哪个滤镜在其行事的任何给定的请求的任何异常。为了在我的所有过滤器中放入完全相同的日志记录代码,将违反DRY。试图将方面挂接到过滤器上会过于复杂。我想不出比继承更好的方式来实现这一目标。

另一个例子是,我可能有一组其仅应用于特定用户或类型的请求的过滤器。一个简单的基本过滤器类有一个抽象的getUsersToApplyFor()将使得这非常容易实现。

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