繁体   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