SpringMVC拦截器创建配置及执行顺序

 更新时间:2022年05月28日 11:28:32   作者:把苹果咬哭的测试笔记  
这篇文章主要为大家介绍了SpringMVC拦截器创建配置及执行顺序,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

SpringMVC拦截器介绍

springMVC 中的拦截器用于拦截控制器方法的执行。

先创建出前置需要的一些条件:

<a th:href="@{/testInterceptor}" rel="external nofollow" >测试拦截器</a>

后端:

@Controller
public class TestController {
    @RequestMapping("/testInterceptor")
    public String testInterceptor() {
        return "success";
    }
}

一、创建拦截器

新建一个包 interceptors,在下面创建一个拦截器 FirstInterceptor ,并且要实现 HandlerInterceptor 接口。

快捷键Ctrl + O,快速重写方法,图示里的 3 个。

public class FirstInterceptor implements HandlerInterceptor {
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("FirstInterceptor --> preHandle");
        return false;
    }
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("FirstInterceptor --> postHandle");
    }
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("FirstInterceptor --> afterCompletion");
    }
}

preHandle: 在当前控制器方法执行之前执行。

postHandle: 在当前控制器方法执行之后执行。

afterCompletion:处理完视图和模型数据,渲染视图完毕之后执行。

二、配置拦截器

在 springMVC 配置文件里配置拦截器,对象就是FirstInterceptor 类:

<!-- 配置拦截器 -->
  <mvc:interceptors>
      <bean class="com.pingguo.mvc.interceptors.FirstInterceptor"></bean>
  </mvc:interceptors>

重新部署,访问http://localhost:8080/springmvc/,发现页面空白,查看控制器日志看到有打印:

说明拦截成功。

看下上面重新的三个方法中,只有preHandle有返回值,是个布尔类型:false 表示拦截,true 表示放行。

修改上面preHandle的返回为 true,重新部署后再次访问首页,可以访问成功。

查看控制台打印输出,看到在渲染之前,前面2个方法执行了:preHandle、postHandle 。

在非常多的 Thymeleaf 渲染之后,最后一个 afterCompletion 也执行了。

现在继续点击首页里的新加的超链接,发现也会被拦截放行。

说明这种配置方式,会拦截所有的请求。

设置不需要拦截的请求

可以通过 ref 或 bean 标签设置拦截器:

  • 通过mvc:mapping设置需要拦截的请求通过
  • mvc:exclude-mapping设置需要排除的请求
<bean name="firstInterceptor" class="com.pingguo.mvc.interceptors.FirstInterceptor"></bean>
    <!-- 配置拦截器 -->
    <mvc:interceptors>
        <mvc:interceptor>
            <mvc:mapping path="/**"/>
            <mvc:exclude-mapping path="/"></mvc:exclude-mapping>
            <ref bean="firstInterceptor"></ref>
        </mvc:interceptor>
    </mvc:interceptors>

注意这里我在外部注册了一个 bean 叫 firstInterceptor,以便 ref 引用。

  • <mvc:mapping path="/**"/>,表示拦截所有请求。
  • <mvc:exclude-mapping path="/">,表示除了首页不拦截。

也就是说,现在我访问http://localhost:8080/springmvc/的时候,应该不拦截。

访问http://localhost:8080/springmvc/testInterceptor就会拦截了。

试一下,先访问 http://localhost:8080/springmvc/:

可以正常打开首页,并且控制台也没有输出拦截器里的内容:

现在继续访问 http://localhost:8080/springmvc/testInterceptor,

拦截了。

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

继续新建一个拦截器SecondInterceptor,注意这次我加了 @Component,方便在配置文件中直接ref引用使用。

@Component
public class SecondInterceptor implements HandlerInterceptor {
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("SecondInterceptor --> preHandle");
        return true;
    }
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("SecondInterceptor --> postHandle");
    }
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("SecondInterceptor --> afterCompletion");
    }
}

修改拦截器配置:

<!-- 配置拦截器 -->
    <mvc:interceptors>
        <ref bean="firstInterceptor"></ref>
        <ref bean="secondInterceptor"></ref>
    </mvc:interceptors>

重新部署,访问下首页http://localhost:8080/springmvc/,查看控制台打印输出。

可以发现,preHandle 方法执行的顺序是 FirstInterceptor->SecondInterceptor。其他 2 个方法则是顺序倒过来。

若每个拦截器的 preHandle()都返回 true:

  • 执行顺序跟配置里的顺序有关,在上面拦截器里 firstInterceptor 就是在 secondInterceptor前面。
  • preHandle()会按照配置的顺序执行,而postHandle()和afterComplation()`会按照配置的反序执行。

若某个拦截器的preHandle()返回了false:

  • preHandle()返回false和它之前的拦截器的preHandle()都会执行。
  • postHandle()都不执行。
  • 返回false的拦截器之前的拦截器的afterComplation()会执行。

试一下,把 SecondInterceptor 中的preHandle()修改返回 false,再次请求下首页:

符合预期。

这些过程可以打断点看下源码的执行过程。

以上就是SpringMVC拦截器创建配置及执行顺序的详细内容,更多关于SpringMVC拦截器配置的资料请关注脚本之家其它相关文章!

相关文章

  • Java使用DateFormatter格式化日期时间的方法示例

    Java使用DateFormatter格式化日期时间的方法示例

    这篇文章主要介绍了Java使用DateFormatter格式化日期时间的方法,结合具体实例分析了java使用DateFormatter格式化日期时间的相关操作技巧,需要的朋友可以参考下
    2017-04-04
  • Spring Aop基本流程原理示例详解

    Spring Aop基本流程原理示例详解

    这篇文章主要给大家介绍了关于Spring Aop基本流程原理的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-04-04
  • JAVA Future类的使用详解

    JAVA Future类的使用详解

    这篇文章主要介绍了JAVA Future类的使用详解,帮助大家更好的理解和学习使用Java,感兴趣的朋友可以了解下
    2021-04-04
  • Java 模拟真正的并发请求详情

    Java 模拟真正的并发请求详情

    有时需要测试一下某个功能的并发性能,又不要想借助于其他工具,索性就自己的开发语言,来一个并发请求就最方便了。下文我们就来学习Java 如何模拟真正的并发请求
    2021-09-09
  • 在SpringBoot中添加Redis及配置方法

    在SpringBoot中添加Redis及配置方法

    这篇文章主要介绍了在SpringBoot中添加Redis及配置redis的代码,需要的朋友可以参考下
    2018-10-10
  • Mybatis基于xml配置实现单表的增删改查功能

    Mybatis基于xml配置实现单表的增删改查功能

    这篇文章主要介绍了Mybatis基于xml配置实现单表的增删改查,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-04-04
  • Java Lambda表达式入门示例

    Java Lambda表达式入门示例

    这篇文章主要介绍了Java Lambda表达式,结合简单实例形式分析了Lambda表达式功能、原理、用法及相关操作注意事项,需要的朋友可以参考下
    2019-09-09
  • SpringBoot实现统一功能处理的教程详解

    SpringBoot实现统一功能处理的教程详解

    这篇文章主要为大家详细介绍了SpringBoot如何实现统一功能处理,文中的示例代码讲解详细,对大家学习或工作有一定借鉴价值,感兴趣的同学可以参考阅读下
    2023-05-05
  • Java随机生成手机短信验证码的方法

    Java随机生成手机短信验证码的方法

    这篇文章主要介绍了Java随机生成手机短信验证码的方法,涉及Java数学运算计算随机数及字符串操作的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-11-11
  • java中hashmap容量的初始化实现

    java中hashmap容量的初始化实现

    这篇文章主要介绍了java中hashmap容量的初始化实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-11-11

最新评论