• 【SpringMVC拦截器】


    拦截器

    一、过滤器作用域浏览器到dispatch之间,在springMVC中,dispatchservlet接收到请求后,会对请求进行处理,根据当前请求信息跟请求映射requestMapping进行匹配,找到相对应的请求映射,请求映射对应的控制器方法就是处理请求的方法,所以dispatchservlet会去调用controller,拦截器作用于控制器执行前后。
    二、SpringMVC中的拦截器用于拦截控制器方法的执行,需要实现HandlerInterceptor

    拦截器的配置

    一、新建springMVC-demo5项目,在html页面测试拦截器:测试拦截器

    二、SpringMVC的拦截器必须在SpringMVC的配置文件中的mvc:interceptors标签中进行配置,该标签中可以写ref、bean、interceptor标签,前两个是一样的:

    1. 一个Bean代表IOC中一个组件、一个对象,在mvc:interceptors标签中配置bean标签,表示某一个类型的对象就是一个拦截器:,但是像这样写会拦截所有的请求
    2. ref可以引用当前IOC容器中某个bean的ID,所以我们可以在ref标签中引用某个拦截器bean的id:,但是像这样写也会拦截所有的请求
    @Component// 把拦截器交给IOC管理,通过标识组件的方式,将拦截器标识为一个bean
    public class FirstInterceptor implements HandlerInterceptor {
    //    控制器方法执行之前执行
        @Override
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
            System.out.println("FirstInterceptor-->preHandle");
            return true;// 返回true表示放行,返回false表示拦截
        }
    
    //    控制器方法执行之后执行
        @Override
        public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
            System.out.println("FirstInterceptor-->postHandle");
        }
    
    //    在视图渲染之后执行
        @Override
        public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
            System.out.println("FirstInterceptor-->afterCompletion");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    1. mvc:mapping的path可以设置需要拦截的路径,/*代表访问上下文路径下面的一层目录,即只拦截/a或/b或/c之类的一层目录。/**标识拦截所有请求,不管是/a还是/c/b/a还是/v/a都会被拦截
      mvc:exclude-mapping的path可以设置需要排除的请求,即不需要拦截的请求,也就是说可以设置除了哪个路径不拦截,其余都拦截
      配置了以上两个后,再使用ref或者bean标签指定拦截器
    <mvc:interceptor>
    	<mvc:mapping path="/**"/>
        <mvc:exclude-mapping path="/"/>
        <ref bean="firstInterceptor">ref>
    mvc:interceptor>
    
    • 1
    • 2
    • 3
    • 4
    • 5

    三、SpringMVC中的拦截器有三个抽象方法:

    1. preHandle:控制器方法执行之前执行preHandle(),其boolean类型的返回值表示是否拦截或放行,返回true为放行,即调用控制器方法;返回false表示拦截,即不调用控制器方法
    2. postHandle:控制器方法执行之后执行postHandle()
    3. afterComplation:处理完视图和模型数据,渲染视图完毕之后执行afterComplation()

    四、多个拦截器的执行顺序:

    1. 若每个拦截器的preHandle()都返回true,此时多个拦截器的执行顺序和拦截器在SpringMVC的配置文件的配置顺序有关:preHandle()会按照配置的顺序执行,而postHandle()和afterComplation()会按照配置的反序执行,例如在本文中新建两个拦截器:前述的FirstInterceptorSecondInterceptorSecondInterceptor是复制FirstInterceptor的,然后在配置文件springMVC.xml中配置两个拦截器,配置顺序为先FirstInterceptor,后SecondInterceptor,具体如下:
    <ref bean="firstInterceptor">ref>
    <ref bean="secondInterceptor">ref>
    
    • 1
    • 2

    点击页面上的链接测试拦截器
    后输出如下:
    在这里插入图片描述

    1. 若某个拦截器的preHandle()返回了false,preHandle()返回false和它之前的拦截器的preHandle()都会执行,postHandle()都不执行,返回false的拦截器之前的拦截器的afterComplation()会执行

    异常处理器

  • 相关阅读:
    vivo积分任务体系的架构演进-平台产品系列05
    ES6中let、const、和var之间的用法以及区别
    API接口获取商品评论
    华为OD机试真题-堆内存申请-2023年OD统一考试(C卷D卷)
    【JVM学习笔记】JVM内存区域定义与内存结构
    线程、并发相关---第六篇
    【Vue+Element-UI】实现登陆注册界面及axios之get、post请求登录功能实现、跨域问题的解决
    Linux:mongodb数据库源码包安装(4.4.25版本)
    统信UOS操作系统aarch64 1060e版制作openssh 9.4p1 rpm包 —— 筑梦之路
    JAVA8 map操作 &删除元素 实战
  • 原文地址:https://blog.csdn.net/CaraYQ/article/details/125879596