SpringMVC中的拦截器Interceptor实现
之前的文章介绍过两个拦截器(分别参考MyBatis功能点之二(2):从责任链设计模式的角度理解插件实现技术和Spring AOP之源码分析)。本文介绍的拦截器实现与它们有何异同呢?
在Spring MVC拦截器(Interceptor)使用中已知实现了HandlerInterceptor接口,MVC会自动拦截。如何实现的呢?改造文章中Spring MVC拦截器(Interceptor)使用的项目使用Spring MVC,不使用Spring Boot的自动配置研究MVC中的拦截器。
在配置类中增加拦截器:
拦截器怎么使用的呢?在DispatcherServlet类中可以发现它们的踪迹:
doDispatch方法中:
从上各图中可以解释Spring MVC拦截器(Interceptor)使用中的第一张图:三次拦截的时机点。那么这个mappedHandler是啥呢?是HandlerExecutionChain
看类名是不是就想到了责任链模式,这里的使用与MyBatis功能点之二(2):从责任链设计模式的角度理解插件实现技术中的类似呢?看具体实现:
与MyBatis中实现一样就是责任链模式的应用。那么interceptor在哪里装载的呢?
在initMapping操作时就加载了interceptor。这就与Mybatis中对于拦截器的应用一样,两个都有一个问题:就是那么多的interceptors,哪个先执行哪个后执行呢?后续有案例可以分析继续分享。
补充:不是本文重点内容,但是实际改造项目的过程中还是遇到了一些问题比较耗时,记录如下:
1、同样的数据库配置和操作在一个项目中可以成功,在这个项目中没有成功(不影响研究拦截器,本文写完为止还没有找到原因);
2、关于数据库和资源文件访问的配置,都是通过JavaBean的方式处理,相对Spring Boot写简单的配置文件而言需要熟悉MVC中的一些组件;
3、关于jsp文件中taglib,提交访问请求总是提示jstl相关内容有问题。检查关于ViewResolver的配置没有问题,在看看jsp文件果然有红色。处理方法很简单——直接把taglib的内容注释了。
所以也充分说明之前成功运行的项目后续不一定能继续成功运行不是没有原因的。
4、在打war包的过程中,配置<directory>E:\ApachePro\apache-tomcat-10.1.19\webapps</directory>的进行打包与不配置在tomcat中有差别。开始使用<directory>E:\ApachePro\apache-tomcat-10.1.19\webapps</directory>,但是总是有问题,后来注释了反而没问题。不知道什么原因,还没有研究——之前这样用没有发现类似的问题。
5、访问url细节问题。关于url,8080后面一定要添加finalName中的内容,在添加controler类中的mapping内容,不然总是提示404.