【问题标题】:Servlet filters inheritanceServlet 过滤器继承
【发布时间】:2014-02-12 11:17:22
【问题描述】:

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

【问题讨论】:

  • 征求意见的风险是你得到很长的答案,无论如何也不能真正解决你的问题。请考虑改写您的问题,使其更具体。另外,请分享您自己的优缺点。
  • 为什么你认为过滤器的继承是错误的?他们是普通班。一点魔法都没有。您唯一应该确保的是如何处理来自父类的配置注释。但是在上面的示例中,您没有通过注释使用配置。

标签: java jakarta-ee inheritance servlet-filters


【解决方案1】:

这种抽象对于处理任何类型的横切关注点都是有用的,类似于切面。

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-24
    • 2012-02-17
    • 2011-02-26
    • 2013-04-09
    相关资源
    最近更新 更多