本文基于Springmvc的拦截器进行分析和总结。只是在项目中用到了拦截器的多个使用场景,有点归纳姑且记录下。
按照国际惯例,文字记录下什么是Springmvc的拦截器以及拦截器的具体方法(虽然文字难咀,但是回头看文字的提炼,就更加印象深刻了)。
1介绍
不罗嗦三点:
1.1什么是拦截器
java里的拦截器是动态拦截action调用的对象。它提供了一种机制可以使开发者可以定义在一个action执行的前后执行的代码,
它提供了一种机制可以使开发者可以定义在一个action执行的前后执行的代码,也可以在一个action执行前阻止其执行。
1.2为什么要使用拦截器
个人觉得重点是:它提供了部分action代码,以及可以对url进行操作,另外在设计权限的项目中,可以考虑用拦截器。
1.3需要实现的方法
1.3.1 preHandler : 是controller的前置方法,当方法返回false整个请求就结束了。多个Interceptor,然后SpringMVC会根据声明的前后顺序
一个接一个的执行,而且所有的Interceptor中的preHandle方法都会在 。
1.3.2 WebRequestInterceptor和HandlerInterceptor的preHandler的方法的区别就在与webRepuestInterceptor的preHandler的方法是没有
拦截的功能,是没有返回值的。
1.3.3 postHandle: 就是在当前请求进行处理之后,也就是Controller方法调用之后执行,但是它会在DispatcherServlet进行视图返回渲染之前被调用。
1.3.4 afterHandler:该方法将在整个请求结束之后,也就是在DispatcherServlet 渲染了对应的视图之后执行,可用于清理资源。
2.图解+代码分析
2.1写拦截器
2.2配置一个Controller层
3.功能效果显示
方法梳理:
第一个方法preHandle尤其重要,他可以根据返回值,改变请求往下的流程,起着先导作用;
第二个方法posHandle,请求通过处理器后,紧接着做一系列的操作;
最后经过最后一个方法,afterCompletion,进行客户端的响应。
在配置web.xml以及Springmvc文件的前提下,向服务器发出/first.do,的请求。如下图我们可以看出来具体的拦截过程(2个):
方案一:开启开启第一道拦截器,改为true,第二道拦截器进行false,查看请求流程:
方法解析:
结合上述图所示,他经过第一道拦截器时,通道开放,往下继续走,当他走到第二道拦截时,发现通道关闭了,但还是走了二道通道的第一方法,
完了请求在这停止,无法通过处理器,但是第一道拦截器已经开启了其通道,故走了最终响应的afterCompletion方法。
方案二:开启第一道拦截器,改为false,第二道拦截器进行true。
方法解析:
根据流程图,走完第一个方法后,停止前进。
方案三:两道通道全部打开,查看请求流程:
结果如图(注意看下图的输出顺序):
个人总结:个人任务拦截器中单个相信大家使用没有问题。但是在涉及到多个拦截器的时候,就会涉及到拦截请求的顺序以及在请求完成后的返回的response 的
发回的顺序,这就在复杂的业务中需要分层处理的时候可以用到。
最后感谢汽车部落格大大对于本文的例子的参考和思路的启发。