目录

  • 1、什么是拦截器
  • 2、使用步骤
  • 3、拦截器的执行时间
  • 4、多个拦截器的执行顺序


1、什么是拦截器

SpringMVC中的Interceptor拦截器是非常重要的,它的主要作用是拦截用户的指定请求,并进行相应的预处理和后处理,其拦截的时间点在“处理器映射器根据用户提交的请求映射除了所要执行的处理器类,并且也找到了要执行处理器类的处理器适配器,在处理器适配器执行持利器之前”。当然,在处理器映射器映射出所要执行的处理器类时,已经将拦截器与持利器组合成为了一个处理器执行立案,并返回给了中央调度器

特点

拦截器是全局的,可以对多个Controller做拦截

一个项目中可以有一个或多个拦截器

常用在用户登录处理、权限检查、记录日志

可以看做是多个Controller中公共的功能,集中到拦截器统一处理,用的依旧是AOP的思想

2、使用步骤

1、定义类(拦截器)实现接口并按需重写方法

public class MyInterceptor implements HandlerInterceptor {

    /*
    预处理方法:
    特点:整个项目的入口,控制请求是否可以被处理
    参数:被拦截的控制器对象
    返回值:true 请求继续向下执行,到达下一个拦截器或者控制器
           false 执行完拦截器方法后就截止
    特点:在控制器方法之前执行,用户的请求先到达此方法
         在这个拦截器方法中,可以获得请求信息,验证请求是否符合要求,验证用户是否有权限访问URL地址
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler){
        System.out.println("拦截器启动");
        return true;
    }

    /*
    后处理方法
    参数:被拦截的处理器对象,处理器方法的返回值
    特点:处理器方法之后执行的;
    	能够获取到处理器方法的返回值ModelAndView,可以修改返回值的数据和视图,影响最后的执行结果
    作用:对原来的执行结果进行二次修正
     */
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView){
        System.out.println("postHandler");
        if (modelAndView != null) {
            //添加数据
            modelAndView.addObject("date", new Date());
        }
    }

    /*
    最后执行的方法
    参数:被拦截的处理器对象;异常对象
    特点:请求处理完成后执行(框架中视图处理完成后视为请求处理完成)
    作用:一般用于资源回收
     */
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex){
        System.out.println("after");
    }
}

2、在SpringMVC配置文件中声明拦截器

<!--拦截器-->
<mvc:interceptors>
    <mvc:interceptor>
        <!--拦截的url地址-->
        <mvc:mapping path="/user/**"/>
        <!--指定拦截器-->
        <bean class="com.ff.utils.MyInterceptor"></bean>
    </mvc:interceptor>
</mvc:interceptors>

3、拦截器的执行时间

拦截器有三个执行时间:

在请求处理之前,也就是说在Controller方法执行之前

在控制器方法执行之后也会执行拦截器

在请求处理执行后也会执行拦截器

4、多个拦截器的执行顺序

如果一个项目中有多个拦截器,那么多个拦截器之间的顺序是如何的?

现在,我们往项目中添加两个拦截器,并设置两个拦截器preHandle的返回值都为真,结果为:

拦截器1的preHandle
拦截器2的preHandle
拦截器2的postHandle
拦截器1的postHandle
拦截器2的afterCompletion
拦截器1的afterCompletion

java 注解 拦截 springmvc 拦截器注解_mvc