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

过滤器和拦截器的区别

  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 中映射的顺序一致。

在这里插入图片描述
例如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 被处理。
在这里插入图片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章