Interceptors拦截器的excludePathPatterns探索

发布时间 2023-05-26 15:40:23作者: 代码即正义

拦截器Interceptors,配置addPathPatterns和excludePathPatterns,可以对制定路径的请求做拦截和放行.
在项目中比较高级别的拦截器例如loginInterceptor会设置addPathPatterns为:"/**",再对特殊的请求做放行,例如静态资源,api接口等.在这里简要展示后端接收到请求后,excludePathPatterns是如何生效的.

DispatcherServlet.doDispatch()

先看getHandler()做了什么
DispatcherServlet.getHandler() -> 在获取执行链的时候,会将满足条件的拦截器初始化

AbstractHandlerMapping.getHandler() -> 具体获取执行链的逻辑

找到的执行链里,做了具体的适配拦截器的判断
AbstractHandlerMapping.getHandlerExecutionChain() -> 执行链初始化后,设置拦截器

adaptedInterceptors里存放的是所有在webConfigurer里配置的拦截器
mappedInterceptor.matches()匹配成功,将拦截器添加在执行链chain.addInterceptor

至此DispatcherServlet.doDispatch方法里的getHandler()执行完成,相关数据已初始化完毕
再看appedHandler.applyPreHandle() 做了什么

很清晰,取出执行链里初始化完成的拦截器,一一调用interceptor.preHandle()方法执行拦截器的处理
不要疑问HandlerExecutionChain.getInterceptors()获得的拦截器哪来的
AbstractHandlerMapping.getHandlerExecutionChain()方法里执行chain.addInterceptor()时添加的.
over~