miller
发布于

springboot 过滤器Filter vs 拦截器Interceptor vs 切片Aspect 详解

csdn 总结的,挺好的
更详细内容: https://blog.csdn.net/zzhongcy/article/details/102498081

拦截机制有三种:

  1. 过滤器(Filter)能拿到http请求,但是拿不到处理请求方法的信息。

  2. 拦截器(Interceptor)既能拿到http请求信息,也能拿到处理请求方法的信息,但是拿不到方法的参数信息。

  3. 切片(Aspect)能拿到方法的参数信息,但是拿不到http请求信息。

  • 作用域不同
    过滤器依赖于servlet容器,只能在 servlet容器,web环境下使用
    拦截器依赖于spring容器,可以在spring容器中调用,不管此时Spring处于什么环境
  • 细粒度的不同
    过滤器的控制比较粗,只能在请求进来时进行处理,对请求和响应进行包装
    拦截器提供更精细的控制,可以在controller对请求处理之前或之后被调用,也可以在渲染视图呈现给用户之后调用
  • 中断链执行的难易程度不同
    拦截器可以 preHandle方法内返回 false 进行中断
    过滤器就比较复杂,需要处理请求和响应对象来引发中断,需要额外的动作,比如将用户重定向到错误页面

3 何时使用拦截器?何时使用过滤器?

如果是非spring项目,那么拦截器不能用,只能使用过滤器。
如果是处理controller前后,既可以使用拦截器也可以使用过滤器。
如果是处理dispaterServlet前后,只能使用过滤器。

拦截器

interceptor 的执行顺序大致为:

请求到达 DispatcherServlet
DispatcherServlet 发送至 Interceptor ,执行 preHandle
请求达到 Controller
请求结束后,postHandle 执行

preHandle() – 在handler执行之前,返回 boolean 值,true 表示继续执行,false 为停止执行并返回。
postHandle() – 在handler执行之后, 可以在返回之前对返回的结果进行修改
afterCompletion() – 在请求完全结束后调用,可以用来统计请求耗时等等

浏览 (1040)
点赞
收藏
评论