拦截器的概述
Spring MVC的拦截器(Interceptor) 与Java Servlet的过滤器(Filter) 类似,它 主要用于拦截用户的请求并做相应的处理。通常应用在权限验证、记录请求信息的日 志、判断用户是否登录等功能上。 拦截器与过滤器区别: ①拦截器是基于java的反射机制的,而过滤器是基于函数回调。 ②拦截器不依赖与servlet容器,过滤器依赖与servlet容器。 ③拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用。 ④拦截器可以访问action上下文、值栈里的对象,而过滤器不能访问。 ⑤在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始 化时被调用一次。 ⑥拦截器可以获取IOC容器中的各个bean,而过滤器就不行,拦截器里可以注 入一个service,可以调用业务逻辑。
-
拦截器的定义
在Spring MVC框架中,定义一个拦截器,需要对拦截器进行定义和配置。定义一个拦截 拦截器之会拦截访问的控制器方法,如果访问了jsp/HTML/CSS/image/js 是不会进行拦截的 器可以通过两种方式:一种是通过实现HandlerInterceptor接口或继承HandlerInterceptor 接口的实现类来定义;另一-种是通过实现WebRequestlnterceptor接C或继承 WebRequestInterceptor接口的实现类来定义。本章以实现HandlerInterceptor接口的定义 方式为例,讲解自定义拦截器的使用方法。
import javax.servlet.http.HttpServletRequest; public class TestInterceptor implements HandlerInterceptor{ @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exceptioro{ System. out.println(" preHandle方法在控制器的处理请求方法前执行"); /**返回true表示继续向下执行,返回false表示中断后续的操作*/ return true;} @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { System.outprintln("postHandle方法在控制器的处理请求方法调用之后,解析视图之前执行");} @Overridel public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { System. outprintIn("afterCompletion方法在控制器的处理请求方法执行完成后执行,即视图渲染结束之后执行");}
在上述拦截器的定义中,实现了HandlerInterceptor接口, 并实现了接口中的三个方法。有关这三个方法的描述如下。 preHandle()方法:该方法在控制器的处理请求方法前执行 其返回值表示是否中断后续操作。返回true表示继续向下执 行,返回false表示中断后续操作。 postHandle()方法:该方法在控制器的处理请求方法调用之 后,解析视图之前执行。可以通过此方法对请求域中的模型和 视图做进一步的修改。 afterCompletion()方法:该方法在控制器的处理请求方法 执行完成后执行,即视图渲染结束后执行。可以通过此方法实 现- -些资源清理、记录日志信息等工作。
-
拦截器的配置
<mvc:interceptors> <!--配置-个全局拦截器,拦截所有请求--> sbean class= "interceptor. TestInterceptor "/> <mvc:interceptor> r <!--配置拦截器作用的路径--> <mvc:mapping path= "/**/> <!--定义在<mvc:interceptor>元素中,表示匹配指定路径的请求才进行拦截--> <bean class= "interceptor.Interceptor1 "/> 历 </mvc:interceptor> < mvc:interceptor> <!--配置拦截器作用的路径--> <mvc:mapping path= "/gotoTest"/> <!--定义在<mvc:interceptor>元素中,表示匹配指定路径的请求才进行拦截--> va <bean class= "interceptor./nterceptor2"/> </mvc:interceptor> </mvc:interceptors> 梦山明呆凹uvuypaussa 执行元成后执行,即视图渲染结束后执行。可以通过此方法买
-
拦截器的执行流程
单个拦截器的执行流程 在配置文件中,如果只定义了一个拦截器,程序首先将执行 拦截器类中的preHandle()方法,如果该方法返回true,程序将 继续执行控制器中处理请求的方法,否则中断执行。如果 preHandle()方法返回true,并且控制器中处理请求的方法执行 后返回视图前,将执行postHandle()方法。返回视图后,才执 行afterCompletion()方法.
<mvc:interceptors> <!--配置-个全局拦截器,拦截所有请求--> <bean class= "interceptor. TestInterceptor"/> t </mvc:interceptors> 二月02, 2020 12:03:56上午org.springframework.web.servlet.PageNotFound noHandle 警告: No mapping found for HTTP request with URI VDemo/] in DispatcherServlet with preHandle方法在控制器的处理请求方法前执行 正在测试拦截器,执行控制器的处理请求方法中 postHandle方法在控制器的处理请求方法调用之后,解析视图之前执行 视图渲染结束。 afterCompletion方法在控制器的处理请求方法执行完成后执行,即视图渲染结束之后执行