springMVC中的拦截器Interceptor

1 拦截器概念

拦截器( Interceptor)是一种动态拦截方法调用的机制 作用:

  1. 在指定的方法调用前后执行预先设定后的的代码

  2. 阻止原始方法的执行

 核心原理: AOP思想 拦截器链:多个拦截器按照一定的顺序,对原始被调用功能进行增强

拦截器VS过滤器

 归属不同: Filter属于Servlet技术, Interceptor属于SpringMVC技术

 拦截内容不同: Filter对所有访问进行增强, Interceptor仅针对SpringMVC的访问进行增强

2自定义拦截器开发过程

实现HandlerInterceptor接口

 

//自定义拦截器需要实现HandleInterceptor接口
public class MyInterceptor implements HandlerInterceptor {
    //处理器运行之前执行
    @Override
    public boolean preHandle(HttpServletRequest request,
                             HttpServletResponse response,
                             Object handler) throws Exception {
        System.out.println("前置运行----a1");
        //返回值为false将拦截原始处理器的运行
        //如果配置多拦截器,返回值为false将终止当前拦截器后面配置的拦截器的运行
        return true;
    }

    //处理器运行之后执行
    @Override
    public void postHandle(HttpServletRequest request,
                           HttpServletResponse response,
                           Object handler,
                           ModelAndView modelAndView) throws Exception {
        System.out.println("后置运行----b1");
    }

    //所有拦截器的后置执行全部结束后,执行该操作
    @Override
    public void afterCompletion(HttpServletRequest request,
                                HttpServletResponse response,
                                Object handler,
                                Exception ex) throws Exception {
        System.out.println("完成运行----c1");
    }

    //三个方法的运行顺序为    preHandle -> postHandle -> afterCompletion
    //如果preHandle返回值为false,三个方法仅运行preHandle
}

3 配置拦截器

<!--开启拦截器使用-->
    <mvc:interceptors>
        <!--开启具体的拦截器的使用,可以配置多个-->
        <mvc:interceptor>
            <!--设置拦截器的拦截路径,支持*通配-->
            <!--/**         表示拦截所有映射-->
            <!--/*          表示拦截所有/开头的映射-->
            <!--/user/*     表示拦截所有/user/开头的映射-->
            <!--/user/add*  表示拦截所有/user/开头,且具体映射名称以add开头的映射-->
            <!--/user/*All  表示拦截所有/user/开头,且具体映射名称以All结尾的映射-->
            <mvc:mapping path="/*"/>
            <mvc:mapping path="/**"/>
            <mvc:mapping path="/handleRun*"/>
            <!--设置拦截排除的路径,配置/**或/*,达到快速配置的目的-->
            <mvc:exclude-mapping path="/b*"/>
            <!--指定具体的拦截器类-->
            <bean class="com.itheima.interceptor.MyInterceptor"/>
        </mvc:interceptor>
        <!--配置多个拦截器,配置顺序即为最终运行顺序-->
        <mvc:interceptor>
            <mvc:mapping path="/*"/>
            <bean class="com.itheima.interceptor.MyInterceptor2"/>
        </mvc:interceptor>
        <mvc:interceptor>
            <mvc:mapping path="/*"/>
            <bean class="com.itheima.interceptor.MyInterceptor3"/>
        </mvc:interceptor>
        <mvc:interceptor>
            <mvc:mapping path="/**"/>
            <bean class="com.itheima.interceptor.MyInterceptor4"/>
        </mvc:interceptor>
    </mvc:interceptors>

 

上一篇:preHandle、postHandle与afterCompletion的区别


下一篇:2022年 HSC-1th中CRYPTO的LINE-GENERATION-TEST