1.前言
SpringMVC中的Interceptor拦截器用于拦截Controller层接口,表现形式有点像Spring的AOP,但是AOP是针对单一的方法。Interceptor是针对Controller接口以及可以处理request和response对象。
只有SpringMVC的工程才能使用拦截器😎
2.HandlerInterceptor接口的定义
在该接口中,定义了以下三个方法:
public interface HandlerInterceptor { boolean preHandle(HttpServletRequest var1, HttpServletResponse var2, Object var3) throws Exception; void postHandle(HttpServletRequest var1, HttpServletResponse var2, Object var3, ModelAndView var4) throws Exception; void afterCompletion(HttpServletRequest var1, HttpServletResponse var2, Object var3, Exception var4) throws Exception
preHandle:
在访问到达Controller之前执行,如果需要对请求做预处理,可以选择在该方法中完成
返回值为true:继续执行后面的拦截器或者Controller
返回值为false:不再执行后面的拦截器和Controller,并调用返回true的拦截器的afterCompletion方法
postHandle:
在执行完Controller方法之后,渲染视图之前执行,如果需要对响应相关的数据进行处理,可以选择在该方法中完成
afterCompletion:
调用完Controller接口,渲染View页面后调用。返回true的拦截器都会调用该拦截器的afterCompletion方法,顺序相反。
3.自定义拦截器和使用
首先编写一个拦截器类,实现HandlerInterceptor接口:
public class MyInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println("处理前..."); return true; } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { System.out.println("处理后..."); } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { System.out.println("清理..."); } }
在Spring配置文件中进行配置:
<!-- 拦截器配置 --> <mvc:interceptors> <mvc:interceptor> <!-- 拦截路径匹配 --> <mvc:mapping path="/HelloController/**"/> <!-- 注册拦截器 --> <bean class="top.imustctf.config.MyInterceptor"/> </mvc:interceptor> </mvc:interceptors>
此时访问路径:
http://localhost:8080/HelloController/xiu
控制台会输出拦截器的提示信息:
处理前... 处理后... 清理...
一个简单的拦截器demo就完成啦!