1.springmvc之Interceptor
springmvc拦截器(Interceptor)针对处理器映射HandlerMapping拦截设置,指定配置的处理器映射器,经过该指定的处理器映射器HandlerMapping映射成功的处理器Handler,使用配置的拦截器。
2.Interceptor与Filter执行关联
1)Filter:Filter是Servlet规范中的过滤器,依赖于servlet容器,若客户端发起请求满足过滤规则,则对客户请求/响应进行拦截,对请求头和请求数据进行检查或改动,并依次通过过滤器链,最后把请求/响应交给请求的Web资源处理。
2)Interceptor:Interceptor拦截器用于拦截指定处理器映射器HandlerMapping下所有处理器,表现形式有点像面向侧面的程序设计(aspect-oriented programming,AOP),但是AOP是针对单一的方法。
客户端发起请求,先经过过滤链处理后,请求在进入springmvc框架中的DispatchServlet中Interceptor针对拦截指定HandlerMaping映射下的所有Handler进行拦截。
3.实现一个Interceptor
1)实现HandlerInterceptor接口
HandlerInterceptor接口的三个方法
该方法在进入Handler方法之前执行,可用于实现身份认证,权限认证
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)throws Exception;
该方法体在Handler方法执行过程中返回ModelAndView执行执行。可以统一管理Model的数据和View视图,存储数据,统一指定视图。
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,ModelAndView modelAndView) throws Exception;
该方法在Handler执行完后执行此反法,可以用以统一异常处理,统一日志处理
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
throws Exception;
2)为指定HandlerMapping配置实现的Interceptor
4.多拦截器(Interceptors)的执行顺序
<!-- 拦截器 -->
<mvc:interceptors>
<!-- 按配置顺序执行拦截器preHandler方法,拦截器其他内部方法执行顺序按拦截器配置顺序倒叙执行 -->
<mvc:interceptor>
<!-- /** 拦截根路径下所有请求 -->
<mvc:mapping path="/**"/>
<bean id="myHandlerInterceptor1" class="com.lin.ssm.interceptor.MyHandlerInterceptor1" />
</mvc:interceptor>
<mvc:interceptor>
<!-- /** 拦截根路径下所有请求 -->
<mvc:mapping path="/**"/>
<bean id="myHandlerInterceptor2" class="com.lin.ssm.interceptor.MyHandlerInterceptor2" />
</mvc:interceptor>
</mvc:interceptors>
按顺序配置MyInterceptor1和MyHandlerInterceptor2,每个的拦截器内部方法带上输出语句,
顺序执行Interceptor结果如下
running the MyHandlerInterceptor1's preHandler
running the MyHandlerInterceptor2's preHandler
running the MyHandlerInterceptor2's postHandle
running the MyHandlerInterceptor1's postHandle
running the MyHandlerInterceptor2's afterCompletion
running the MyHandlerInterceptor1's afterCompletion
结论:多拦截器(Interceptors)的执行顺序,按配置顺序执行拦截器preHandler方法,拦截器其他内部方法执行顺序按拦截器配置顺序倒叙执行