Java架构直通车——过滤器和拦截器使用

文章目录

  • 过滤器和拦截器的区别
  • Filter过滤器
  • Interceptor拦截器

过滤器和拦截器的区别

  1. 规范不同:
    Filter是Servlet规范中定义的,是Servlet容器支持的。而拦截器是Spring容器内的,是Spring框架支持的。
  2. 作用深度不同:
    Filter在Servlet前后起作用,而拦截器可以深入到方法的前后、异常抛出前后起作用,具有更大的弹性。
  3. 从设计模式的角度分析:
    过滤器(Filter):当你有一堆东西的时候,你只希望选择符合你要求的某一些东西。定义这些要求的工具,就是过滤器。(漏网
    拦截器(Interceptor):在一个流程正在进行的时候,你希望干预它的进展,甚至终止它进行,这是拦截器做的事情。(大坝

不过做真正实现的时候,主要还是关注第二点,在设计模式上的区分不大。

Filter过滤器

对于从 Servlet 开始入门学 Java 后台的同学来说,Filter 过滤器这个概念应该不会陌生。Filter 过滤器主要是用来过滤用户请求的,它允许我们对用户请求进行前置处理和后置处理,比如实现 URL 级别的权限控制、过滤非法请求等等。Filter 过滤器是面向切面编程——AOP 的具体实现。

另外,Filter 是依赖于 Servlet 容器,Filter接口就在 Servlet 包下面,属于 Servlet 规范的一部分。所以,很多时候我们也称其为“增强版 Servlet”。如果我们需要自定义 Filter 的话非常简单,只需要实现 javax.Servlet.Filter 接口,然后重写里面的 3 个方法即可!

public class MyFilter implements Filter {
    // 初始化过滤器后执行的操作
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }
    // 对请求进行过滤
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {

    }
    // 销毁过滤器后执行的操作,对某些资源的回收
    @Override
    public void destroy() {

    }
}

当在 web.xml 中注册了一个 Filter 来对某个 Servlet 程序进行拦截处理时,这个Filter 就成了 Tomcat 与该 Servlet 程序的通信线路上的一道关卡
若有多个 Filter 程序对某个 Servlet 程序的访问过程进行拦截,当针对该 Servlet 的访问请求到达时,web 容器将把这多个 Filter 程序组合成一个 Filter 链(过滤器链)。Filter 链中各个 Filter 的拦截顺序与它们在应用程序的 web.xml 中映射的顺序一致。

Java架构直通车——过滤器和拦截器使用_第1张图片
例如Mybatis会注册一个拦截器的数组集合,然后遍历这个拦截器数组获取到注册的拦截器。

Interceptor拦截器

拦截器(Interceptor)同 Filter 过滤器一样,它俩都是面向切面编程——AOP 的具体实现。

如果你需要自定义 Interceptor 的话必须实现 org.springframework.web.servlet.HandlerInterceptor接口或继承 org.springframework.web.servlet.handler.HandlerInterceptorAdapter类,并且需要重写下面下面3个方法:

public class MyInceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        return false;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {

    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {

    }
}

preHandle方法返回 true或 false。如果返回 true,则意味着请求将继续到达 Controller 被处理。
Java架构直通车——过滤器和拦截器使用_第2张图片

你可能感兴趣的:(Java架构直通车)