• [springMVC学习]11、自定义拦截器


    目录

    简介

    拦截器执行流程

    基本使用

    多个拦截器执行顺序

    总结


    简介

            在springMVC中我们可以自定义拦截器来对请求进行拦截,进行相应的处理


    拦截器执行流程

            拦截器是一个接口,里面有3个方法

    • preHandle:在目标handler执行前调用
    • postHandle:在目标handler执行完成后进行调用
    • afterCompletion:在视图渲染后调用

            示意图如下


    基本使用

            首先创建一个类,实现HandlerInterceptor接口

    1. @Component
    2. public class MyInterceptor01 implements HandlerInterceptor {
    3. @Override
    4. public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    5. System.out.println("调用preHandle方法");
    6. //返回false不会执行目标方法
    7. return true;
    8. }
    9. @Override
    10. public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
    11. System.out.println("调用postHandle方法");
    12. }
    13. @Override
    14. public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
    15. System.out.println("调用afterCompletion方法");
    16. }
    17. }

            创建一个handler

    1. @RequestMapping("/member")
    2. @Controller
    3. public class MemberController {
    4. @RequestMapping("/f1")
    5. public String f1() {
    6. System.out.println("执行目标f1方法");
    7. return "success";
    8. }
    9. }

             然后配置拦截器要对哪些请求进行拦截

    1. <mvc:interceptors>
    2. <mvc:interceptor>
    3. <mvc:mapping path="/**"/>
    4. <ref bean="myInterceptor01"/>
    5. mvc:interceptor>
    6. mvc:interceptors>

             上面配置的是会对所有请求进行拦截(**表示多级目录),下面访问对应handler查看输出

            我们将preHandle方法返回值改为false

    1. @Override
    2. public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    3. System.out.println("调用preHandle方法");
    4. //返回false不会执行目标方法
    5. return false;
    6. }

            再次请求


    多个拦截器执行顺序

            在前面的基础上,再创建一个拦截器

    1. @Component
    2. public class MyInterceptor02 implements HandlerInterceptor {
    3. @Override
    4. public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    5. System.out.println("调用preHandle--02方法");
    6. //返回false不会执行目标方法
    7. return true;
    8. }
    9. @Override
    10. public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
    11. System.out.println("调用postHandle--02方法");
    12. }
    13. @Override
    14. public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
    15. System.out.println("调用afterCompletion--02方法");
    16. }
    17. }

             配置拦截器

    1. <mvc:interceptor>
    2. <mvc:mapping path="/**"/>
    3. <ref bean="myInterceptor02"/>
    4. mvc:interceptor>

            现在2个拦截器的preHandl都是返回true,放行的,下面查看输出

             可以知道执行顺序是 A(pre)->B(pre)->目标方法->B(post)->A(post)->B(after)->A(after)的顺序执行的。

            我们方法为什么是过滤器01先执行呢,其实这个顺序就是和spring配置顺序一样的,我在配置文件中先配置的过滤器01,下面交换一下顺序

    1. <mvc:interceptors>
    2. <mvc:interceptor>
    3. <mvc:mapping path="/**"/>
    4. <ref bean="myInterceptor02"/>
    5. mvc:interceptor>
    6. <mvc:interceptor>
    7. <mvc:mapping path="/**"/>
    8. <ref bean="myInterceptor01"/>
    9. mvc:interceptor>
    10. mvc:interceptors>

             再次请求,输出如下,还是符合A(pre)->B(pre)->目标方法->B(post)->A(post)->B(after)->A(after)

             将顺序换回来,然后将第一个拦截器的和第二个拦截器的preHandle方法分别返回false,输出如下

             可以发现,只要preHandle执行后返回为true,那么afterCompletion就会执行


    总结

            拦截器可以对请求的一些消息进行过滤,也可以在视图渲染之后执行一些释放的操作,拦截器可以说是和过滤器十分的相似。

  • 相关阅读:
    电力、工业、林业、安防都在用的国产测距仪---TFN D4KI 激光测距仪 双目
    【Bug——VMware Workstation】虚拟机桥接网络没有 VMnet0
    最新 Kubernetes 集群部署 + Contranerd容器运行时 + flannel 网络插件(保姆级教程,最新 K8S 1.28.2 版本)
    SpringBoot SpringBoot 原理篇 3 核心原理 3.3 启动流程【2】
    关于 硬盘
    [附源码]计算机毕业设计SpringBoot蛋糕购物商城
    android 自学资料
    Redis非关系型数据库
    算法 | 中缀表达式转后缀表达式并计算结果(利用栈)
    什么是shell?模拟实现shell(深刻理解shell的内建命令)
  • 原文地址:https://blog.csdn.net/m0_51545690/article/details/126086670