拦截器是一种在软件系统中用于拦截并处理请求、事件或消息的组件。它可以在请求到达目标对象之前或之后执行特定的逻辑或功能,以实现对请求的控制、处理或修改。拦截器和 AOP 类似,可以在原始方法的前面或后面追加功能,也可以调用原始方法。在面向对象编程中,拦截器通常与面向切面编程(AOP)结合使用,以实现对系统中各个模块的统一管理和控制。
1.定义拦截器类
把该类作为Bean 对象管理到容器,加上@Component 标签
定义一个拦截器,并实现 HandlerInterceptor 接口,覆盖接口中的三个方法
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {}
第一个方法,是在原始方法的前面执行,含有三个参数,request 代表请求体,可以通过request 获取到请求的相关信息。response 代表响应体,可以通过 response 获取到响应的相关信。handler 可以调用原始方法,并且能获取到原始方法的相关信息
注意:如果第一个方法返回结果为 true ,则可以继续执行原始方法,第二个方法和第三个方法,如果第一个方法返回结果为 false ,则会终止原始方法的执行,同时也会终止第二个方法和第三个方法的执行。所以我们可以在第一个方法中增加一些判断条件,来决定返回 true 还是 false。
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {}
第二个方法,是在原始方法的后面执行,其中的 modelAndView 参数,可以在页面跳转时携带数据
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {}
第三个方法,是在第二个方法的后面执行,其实的 ex 参数,可以获取到控制类中的异常信息
2.定义拦截路径
定义一个配置类,在该类中定义拦截器所需拦截的路径。
自动注入拦截器的对象,并在覆盖方法中定义拦截器所需拦截的路径,可以用 * 号代替
3.定义Mvc配置类
在Mvc配置类中,扫描定义的拦截器类,拦截器配置类
4.定义控制类中的方法
在控制类中定义一个被拦截路径的方法
5.定义Web容器
6.打印程序执行顺序
从执行顺序可以看出,执行的是:前置方法,原始方法,后置方法,最终方法
7.多个拦截器的使用
7.1定义第二个拦截器类
同第一个拦截器一样,只是把打印的语句换一下
7.2在拦截器的配置类中定义两个拦截路径
7.3打印执行顺序
执行顺序为:第一个前置方法,第二个前置方法,原始方法,第二个后置方法,第一个后置方法,第二个最终方法,第一个最终方法
如果把第二个拦截器类中的第一个前置方法的返回结果改为 false ,则执行顺序是:第一个前置方法,第二个前置方法,第一个最终方法
也就是说原始方法不会执行