• Spring中过滤器(Filter)和拦截器(Interceptor)的区别和联系


    在我们日常的开发中,我们经常会用到Filter和Interceptor。有时同一个功能。Filter可以做,Interceptor也可以做。有时就需要考虑使用哪一个比较好。这篇文章主要介绍一下,二者的区别和联系。希望给大家进行选择的时候,提供一些帮助

    Filter 和 Interceptor 的区别

    Filter

    过滤器(Filter)是在请求进入Tomcat容器之后,请求进入Servlet之前执行。Filter是Servlet规范规定的,只能用于web程序中。

    Interceptor

    拦截器(Interceptor)是在Servlet和Controller控制器之间执行。Interceptor是SpringframeWork中规定的。

    • Interceptor是基于java的反射机制的,而Filter是基于函数回调。
    • Interceptor不依赖与servlet容器,Filter依赖与servlet容器。
    • Interceptor只能对action请求起作用,而Filter则可以对几乎所有的请求起作用。
    • Interceptor可以访问action上下文、值栈里的对象,而Filter不能访问。
    • Interceptor以获取IOC容器中的各个bean,而过滤器就不行,这点很重要,在拦截器里注入一个service,可以调用业务逻辑。拦截器可以获取ioc中的service bean实现业务逻辑。
    Spring MVC中每个控制器中可以定义多个请求处理方法,我们把这种请求处理方法简称为Action

    Filter的实现

    自己的filter需要要实现javax.servlet.Filter.

    import javax.servlet.*;
    import java.io.IOException;
    
    public class Myfilter implements Filter {
        @Override
        public void init(FilterConfig filterConfig) throws ServletException {
            System.out.println("Myfilter init");
        }
    
        @Override
        public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
            System.out.println("Myfilter doFilter before");
            filterChain.doFilter(servletRequest,servletResponse);
            System.out.println("Myfilter doFilter after");
        }
    
        @Override
        public void destroy() {
            System.out.println("Myfilter destroy");
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    注册Filter在web.xml中

    
        
            myfilter
            com.hardy.config.Myfilter
        
        
            myfilter
            /*
        
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    Interceptor的实现

    自己的Interceptor需要要实现org.springframework.web.servlet.HandlerInterceptor.

    import org.springframework.web.servlet.HandlerInterceptor;
    import org.springframework.web.servlet.ModelAndView;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    public class MyInterceptor implements HandlerInterceptor {
        @Override
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
            // 在拦截点(Controller方法处理之前)执行拦截 若返回的是false则中断执行 反之亦然
            System.out.println("MyInterceptor preHandle");
            return HandlerInterceptor.super.preHandle(request, response, handler);
        }
    
        @Override
        public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
            // 在处理过程中(Controller方法处理完之后  DispatcherServlet进行视图的渲染之前)执行拦截
            System.out.println("MyInterceptor postHandle");
            HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);
        }
    
        @Override
        public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
            // 在DispatcherServlet进行视图的渲染后 返回前进行拦截
            System.out.println("MyInterceptor afterCompletion");
            HandlerInterceptor.super.afterCompletion(request, response, handler, ex);
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29

    注册Interceptor在spring的配置文件中(application.xml)

        
        
            
                
                
                
                
                
                
                
            
        
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
  • 相关阅读:
    鸿蒙HarmonyOS实战-Stage模型(服务卡片介绍和运行机制)
    web端调用本地摄像头麦克风+WebRTC腾讯云,实现直播功能
    MySQL中字符串比较大小(日期字符串比较问题)
    【MySql进阶】索引详解(二):Mysql InnoDB索引原理、B+树、聚簇索引、二级索引、联合索引
    docker的组件和资源管理
    [Mac软件]Infuse 7 PRO v7.6.3 一个强大的视频播放器(激活版)
    Java高频面试复习题,助你吊打面试官
    【技术分享】SLA(服务等级协议)原理与配置
    YRX app第八题 python grpc
    鲁棒优化不确定性问题
  • 原文地址:https://blog.csdn.net/Huangjiazhen711/article/details/127548785