请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

在spring mvc中,过滤器和拦截器有啥区别

对这两个的概念比较模糊,绝大部分情况下是采用的过滤器,我也查过一些资料,说过滤器的适用范围比拦截器广,拦截器能实现的,过滤器也能实现。
个人片面的理解,过滤器一般用在系统的前置业务中(比如安全认证,同一处理),而拦截器是用在处理过程中或者后置业务中(比如:mybatis拦截,mvc统一返回响应等等)。

正在回答

1回答

阿斯拉菲你好:

    其实关于过滤器和拦截器的问题、博客、文章已经是非常多了但是还是有太多太多的同学搞不懂看不清琢磨不透它们。我总结的主要原因有两点第一就是用得少第二就是网络上的信息太过于琐碎且描述上太过于书本化实用性不强。我这里就使用大白话的方式来对这个问题进行解读。

    首先需要知道过滤器和拦截器都是基于AOP编程思想的先理解一下AOP的概念AOP不是一种具体的技术而是一种编程思想。在面向对象编程的过程中我们很容易通过继承、多态来解决纵向扩展。 但是对于横向的功能比如在所有的service方法中开启事务或者统一记录日志等功能面向对象的是无法解决的。所以AOP——面向切面编程其实是面向对象编程思想的一个补充。

    另外我们来说说它们最核心的区别区别其实说起来会有很多很多但是你只需要知道几个就足够了

    1. Filter 是依赖于 Servlet 容器属于 Servlet 规范的一部分而拦截器则是独立存在的可以在任何情况下使用也就是说不是 SpringMVC 环境一样可以使用拦截器不过这种方式很少见到

    2. Filter 的执行由 Servlet 容器回调完成而拦截器通常通过动态代理的方式来执行

    3. 拦截器是基于Java的反射机制的而过滤器是基于函数回调

    4. 过滤器不能对用户请求直接生成响应但是拦截器可以这一点非常重要可以写个 demo 试试

    接下来我们来看看他们的调用顺序

    filter -> interceptor -> ControllerAdvice ->  controller

    返回顺序正好是相反的

    controller ->  controllerAdvice -> Interceptor -> Filter

    所以由此你也就知道了过滤器和拦截器虽然执行的时机不一样但是它们都处于 Controller 之前执行也就是你的 Service 之前。那么对于你的应用功能来说基本上使用过滤器和拦截器都是可行的方案。

    最后一句话总结下关于拦截器和过滤器吧

        拦截器相比过滤器有更细粒度的控制依赖于 Spring 容器可以在请求之前或之后启动过滤器主要依赖于 Servlet过滤器能做的拦截器基本上都能做。


    我是勤一致力于将这门课程的问答区打造为 Java 知识体系知识库Java 知识体系 BBS共同建造、维护这门课程我需要每一个你

    

5 回复 有任何疑惑可以回复我~
  • 提问者 阿斯拉菲 #1
    非常感谢!
    回复 有任何疑惑可以回复我~ 2020-09-07 13:56:32
  • 一哥,我追问一下。为什么不建议在filter里写返回呢。我使用如下代码:  
    
    ```java
    @Override
        public void doFilter(
                ServletRequest servletRequest, ServletResponse servletResponse,
                FilterChain filterChain) throws IOException, ServletException {
            HttpServletRequest request = (HttpServletRequest) servletRequest;
            if (StringUtils.startsWith(request.getRequestURI(), "/fast")) {
                PrintWriter writer = servletResponse.getWriter();
                writer.write("filter return.");
                writer.flush();
                return;
            }
            filterChain.doFilter(servletRequest, servletResponse);
        }
    ```
    
    也是可以正常返回的,禁止在filter里写响应是为什么呢?
    回复 有任何疑惑可以回复我~ 2020-09-07 18:55:39
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信