SpringMVC(五)——拦截器
1.概述
SpringMVC的拦截器(Interceptor)类似于Servlet的过滤器(Filter),它主要用于拦截用户请求并做出相应的处理。例如拦截未登录用户、进行权限验证、记录请求信息的日志等。
2.拦截器的实现
(1)拦截器类
实现HandlerInterceptor接口或者继承HandlerInterceptorAdapter类
public class UserInterceptor implements HandlerInterceptor{ @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object object) throws Exception { System.out.println("User拦截器执行了preHandle()"); return true; } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object object, ModelAndView mav) throws Exception { System.out.println("User拦截器执行了postHandle()"); } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object object, Exception e) throws Exception { System.out.println("User拦截器执行了afterCompletion()"); } }
preHandler():该方法会在控制器方法前执行,其返回值表示是否中断后续操作。当其返回值为true时,表示继续向下执行;当其返回值为false时,会中断后续的所有操作。
postHandle():该方法会在控制器方法调用之后,且解析视图之前执行。可以通过此方法对请求域中的模型和视图做出进一步的修改。
afterCompletion():该方法会在整个请求完成,即视图渲染结束之后执行。可以通过此方法实现一些资源清理、记录日志信息等工作。
(2)配置拦截器
先引入mvc命名空间
<!-- 配置一组拦截器 --> <mvc:interceptors> <!-- <interceptors>标签下的类将拦截所有请求 --> <bean class="com.mvc.interceptor.UserInterceptor"/> <!-- 拦截器1,严格按顺序配置拦截路径、不拦截路径、拦截器类 --> <mvc:interceptor> <mvc:mapping path="/**/"/> <mvc:exclude-mapping path=""/> <bean class="com.mvc.interceptor.Interceptor1" /> </mvc:interceptor> <!-- 拦截器2,同上 --> <mvc:interceptor> <mvc:mapping path="/**/"/> <mvc:exclude-mapping path=""/> <bean class="com.mvc.interceptor.Interceptor2" /> </mvc:interceptor> </mvc:interceptors>
(3)执行过程
单个拦截器:发起请求,preHandler()方法如果返回true,处理请求的方法,postHandle()方法,afterCompletion()方法。
多个拦截器:如上按照User拦截器、拦截器1、拦截器2来执行preHandler()方法,但是postHandle()方法和afterCompletion()方法按照preHandler()的逆序来执行。