springboot filter and interceptor
Posted exact
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了springboot filter and interceptor相关的知识,希望对你有一定的参考价值。
1.1 filter、interceptor
1.1.1 filter 过滤器
1.1.1.1 实现方法
init(FilterConfig paramFilterConfig) - 当容器初始化filter时调用,该方法在filter的生命周期只会被调用一次(单例)。
doFilter(ServletRequest request, ServletResponse response, FilterChain chain) – web容器每一次请求都会调用该方法。注意这里是通过容器的回调进行调用的。FilterChain用来调用下一个过滤器。
void destroy()
- 当容器销毁Filter实例时调用该方法,可以在方法中销毁资源,该方法在Filter的生命周期只会被调用一次。
1.1.1.2 调用顺序
HttpRequest —-> Filter —-> Servlet —-> Controller/Action/… —-> Filter —-> HttpResponse
1.1.1.3 debug调用顺序
1.1.2 interceptor 拦截器
1.1.2.1 实现方法
preHandle() - 在handler执行之前,返回boolean值,true表示继续执行,false为停止执行并返回。
postHandle() - 在处理程序执行之后,可以在返回之前对返回的结果进行修改
afterCompletion() - 在请求完全结束后调用,可以用来统计请求耗时等等
1.1.2.2 调用顺序
请求到达DispatcherServlet
DispatcherServlet发送至拦截器,执行preHandle
请求到达控制器
请求正常结束后执行postHandle,afterCompletion
请求异常结束则只执行afterCompletion
HttpRequest —-> DispactherServlet —-> HandlerInterceptor —->Controller—-> HandlerInterceptor —-> HttpResponse
1.1.2.3 debug图解顺序
代码调用逻辑如下图:1,3是preHandle,和postHandle。 2是反射调用controller对应的实际要执行的方法, 4是afterCompletion
下面是preHandle调用栈
1.1.3 过滤器拦截器对比
1.1.3.1 总体调用流程
(图片来源 https://blog.csdn.net/hanziang1996/article/details/79655140)
1.1.3.2 对比
过滤器由servlet容器(tomcat、jetty…)通过回调的方式调用的(进入spring框架之前)
拦截器是由spring框架的DispatcherServlet调用的,基于动态代理
拦截器可以在方法调用前后调用,过滤器多了一种(可以在异常之后调用)
过滤器依赖于servlet容器
拦截器依赖于spring容器
1.1.3.3 作用
两者的应用场景大致相同,可以做如下任务:
登录认证
请求记录(次数,时间,url)
mdc打印日志
l 过滤器依赖于servlet容器
l 拦截器依赖于spring容器
1.1.1.1 作用
两者的应用场景大致相同,可以做如下任务:
登录认证
请求记录(次数,时间,url)
mdc打印日志
以上是关于springboot filter and interceptor的主要内容,如果未能解决你的问题,请参考以下文章
SpringBoot SpringBoot过滤器Filter