SpringMVC拦截器

请求处理流程

在这里插入图片描述

拦截器简介

  • 拦截器(Interceptor)是一种动态拦截方法调用的机制
  • 作用
    1. 在指定的方法调用前后执行预先设定的代码
    2. 阻止原始方法的执行
  • 核心原理:AOP思想

拦截器链

多个拦截器按照一定的顺序,对原始方法的功能进行增强。

拦截器VS过滤器

  • 归属不同

    Filter属于Servlet的技术,Interceptor属于SpringMVC的技术。

  • 拦截内容不同

    Filter对所有访问进行拦截,Interceptor只针对SpringMVC的访问请求进行拦截。

拦截器的作用

使用AOP的思想,对原始方法功能增强。

拦截器的配置流程

  1. 创建拦截器处理类,实现HandlerInterceptor处理程序拦截器接口,覆写其默认方法。

    /**
     * 拦截器处理类
     */
    public class MyInterceptor implements HandlerInterceptor {
    
        /**
         * 前置处理方法,在原始方法执行之前执行
         *
         * @param request  请求对象
         * @param response 响应对象
         * @param handler  -> public void com.itheima.controller.ResponseDemo.demo14() 原始方法对象,实际上是一个Method数据类型的对象
         * @return 如果前置方法返回为false,表示不再往后执行,原始方法也会被拦截,不会执行;如果返回true则继续往后执行
         * @throws Exception
         */
        @Override
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
            return false;
        }
    
        /**
         * 后置处理方法,在原始方法执行之后执行
         *
         * @param request
         * @param response
         * @param handler      原始方法对象
         * @param modelAndView 模型视图对象,用于返回给核心控制器,分配给视图解析器解析后,展示给用户
         * @throws Exception
         */
        @Override
        public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
    
        }
    
        /**
         * 完成处理方法,该方法最后执行,在后置方法之后执行
         *
         * @param request
         * @param response
         * @param handler  原始对象方法
         * @param ex       异常对象,用于获取原始方法执行的异常信息
         * @throws Exception
         */
        @Override
        public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
    
        }
    

    要注意的是前置方法的返回值,如果返回false则终止方法的执行,原始方法及后置方法、完成方法都不会执行。

    返回true,就继续往后依次执行。

  2. 在配置文件中配置拦截器

    spring-mvc.xml

    <!--配置拦截器-->
    <mvc:interceptors>
    	<!--可以配置多个拦截器-->
    	<mvc:interceptor>
    		<!--配置要拦截的请求地址-->
    		<mvc:mapping path="/demo14"/>
    		<!--配置拦截器处理类,就是我们编写第一步编写的类-->
    		<bean class="com.itheima.interceptor.MyInterceptor"/>
    	</mvc:interceptor>
    </mvc:interceptors>
    
    • mapping标签:可以配置多个,支持通配符*
      • * :表示任意名称,/*仅表示根路径下任意名称,不再往下匹配目录
      • **:表示当前路径及其子路径, /**表示根路径及其子路径下的任意名称
    • exclude-mapping标签:用于排除不需要拦截的请求地址,支持通配符*
    • bean标签及ref标签:在一个<mvc:interceptor>标签中,只能配置一个,用于配置拦截器处理类。

拦截器使用实例

  • 原始方法

    @RequestMapping("/demo14")
    public void demo14() {
    	System.out.println("原始方法执行");
    }
    
  • 拦截器处理类

    /**
     * 拦截器处理类
     */
    public class MyInterceptor implements HandlerInterceptor {
    
    
        /**
         * 前置方法,在原始方法执行之前执行
         */
        @Override
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
            System.out.println("前置处理");
            return true;
        }
    
        /**
         * 后置方法,在原始方法执行之后执行
         */
        @Override
        public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
            System.out.println("后置处理方法");
        }
    
        /**
         * 完成后方法,该方法最后执行,在后置方法之后执行
         */
        @Override
        public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
            System.out.println("完成处理方法");
        }
    }
    
  • 配置拦截器

    spring-mvc.xml

    <!--配置拦截器-->
    <mvc:interceptors>
    	<!--可以配置多个拦截器-->
    	<mvc:interceptor>
    		<!--配置要拦截的请求地址-->
    		<mvc:mapping path="/demo14"/>
    		<!--配置拦截器处理类,就是我们编写第一步编写的类-->
    		<bean class="com.itheima.interceptor.MyInterceptor"/>
    	</mvc:interceptor>
    </mvc:interceptors>
    
  • 测试结果

    请求url:http://localhost:80/demo14

    结果:

    在这里插入图片描述

拦截器执行流程

在这里插入图片描述

拦截器链的配置说明

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值