本文以一个通过正常注册拦截器流程注册拦截器失败的实际场景,来带领大家阅读源码,体会Spring的HandlerInterceptor拦截器整个工作流程简单认识
WebMvcConfigurationSupport的一个子类,它检测并委托给所有WebMvcConfigurer类型的bean,允许它们自定义WebMvcConfigurationSupport提供的配置。这是@EnableWebMvc实际导入的类。org.springframework.web.servlet.config.annotation.DelegatingWebMvcConfiguration#addInterceptors方法:
ant风格路径模式的PathMatcher实现。重点来了,细心的朋友会发现, 其遍历的拦截器列表,是org.springframework.web.servlet.handler.AbstractHandlerMapping#adaptedInterceptors,不是我们上面提及的org.springframework.web.servlet.handler.AbstractHandlerMapping#interceptors,这也就解释了为啥我们的拦截器好像没注册成功的原因,原来还差一步没衔接上。
部分映射代码是从Apache Ant中借来的。
该映射使用以下规则匹配url:
? 匹配一个字符
*匹配零个或多个字符
** 匹配路径中的零个或多个目录
{spring:[a-z]+}匹配regexp [a-z]+作为名为"spring"的路径变量
例子
com/t?st .jsp -匹配com/test.jsp,也匹配com/ taste .jsp或com/txst.jsp .jsp com/t?st.jsp — matches com/test.jsp but also com/tast.jsp or com/txst.jsp
com/.jsp — 匹配所有在com文件夹中的 .jsp
com/ * * /test.jsp — 匹配com路径下的所有 test.jsp文件
org/springframework/ * * /*.jsp —匹配org/springframework路径下的所有.jsp
com/{filename:\w+}.jsp 匹配com/test.jsp 并将值 test 赋值给 filename 变量
注意:模式和路径必须都是绝对的,或者都是相对的,以便两者匹配。因此,建议使用此实现的用户对模式进行消毒,以便在使用模式的上下文中使用“/”作为前缀。
ApplicationObjectSupport实现了ApplicationContextAware接口最终实现
欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) | Powered by Discuz! X3.4 |