• [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就会执行


    总结

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

  • 相关阅读:
    设计模式之【建造者模式】
    「南凌科技SASE DAY」助力企业数字化转型的挑战和应对实践
    jupyter notebook中查看python版本的解决方案
    927. 三等分-按1划分 -力扣双百代码
    服务网关之Spring Cloud Gateway
    阿里直呼真省钱,全网首发IntelliJ IDEA应用实战手册竟遭哄抢
    FFmpeg入门详解之9:Audacity音频工具
    【Python】对MySQL数据库的操作(SQLAlchemy)
    2022算能生态合作伙伴大会,英码科技应邀出席共同探讨生态合作和发展问题
    基础 | 并发编程 - [多线程进度控制]
  • 原文地址:https://blog.csdn.net/m0_51545690/article/details/126086670