• 【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()会执行

    异常处理器

  • 相关阅读:
    C高级作业 【使用shell脚本】 实现一个对数组求和的函数,数组通过实参传递给函数+写一个函数输出当前用户的uid和gid,并使用变量接收结果
    【自然语言处理】【向量表示】AugSBERT:改善用于成对句子评分任务的Bi-Encoders的数据增强方法
    首尾交换数组元素
    go语言学习之旅之Go语言数据类型
    Linux Systemd 配置开机自启
    You may use special comments to disable some warnings
    APS排产考虑生产动态合并优化
    解决LocalDateTime中的‘T’
    CSS之复合选择器与伪类选择器
    Scikit-Learn随机森林回归
  • 原文地址:https://blog.csdn.net/CaraYQ/article/details/125879596