SpringMVC * 创建配置及执行顺序

作者:把苹果咬哭的测试笔记 时间:2023-06-06 20:41:16 

SpringMVC * 介绍

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

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

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

后端:

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

一、创建 *

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

SpringMVC * 创建配置及执行顺序

快捷键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/,发现页面空白,查看控制器日志看到有打印:

SpringMVC * 创建配置及执行顺序

说明拦截成功。

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

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

SpringMVC * 创建配置及执行顺序

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

SpringMVC * 创建配置及执行顺序

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

SpringMVC * 创建配置及执行顺序

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

SpringMVC * 创建配置及执行顺序

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

设置不需要拦截的请求

可以通过 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/:

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

SpringMVC * 创建配置及执行顺序

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

SpringMVC * 创建配置及执行顺序

拦截了。

三、多个 * 的执行顺序

继续新建一个 * 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/,查看控制台打印输出。

SpringMVC * 创建配置及执行顺序

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

若每个 * 的 preHandle()都返回 true:

  • 执行顺序跟配置里的顺序有关,在上面 * 里 firstInterceptor 就是在 secondInterceptor前面。

  • preHandle()会按照配置的顺序执行,而postHandle()和afterComplation()`会按照配置的反序执行。

若某个 * 的preHandle()返回了false:

  • preHandle()返回false和它之前的 * 的preHandle()都会执行。

  • postHandle()都不执行。

  • 返回false的 * 之前的 * 的afterComplation()会执行。

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

SpringMVC * 创建配置及执行顺序

符合预期。

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

来源:https://blog.csdn.net/wessonlan/article/details/124812949

标签:SpringMVC, , ,配置
0
投稿

猜你喜欢

  • springBoot @Scheduled实现多个任务同时开始执行

    2023-06-19 23:16:41
  • 详解spring boot引入外部jar包的坑

    2021-07-29 10:49:49
  • java求100之内的素数(质数)简单示例

    2023-11-07 03:12:32
  • springboot无法从静态上下文中引用非静态变量的解决方法

    2022-03-05 16:50:05
  • java 过滤器filter防sql注入的实现代码

    2023-08-30 09:56:40
  • 为什么阿里巴巴要求日期格式化时必须有使用y表示年

    2023-11-02 20:08:58
  • java8中:: 用法示例(JDK8双冒号用法)

    2023-11-25 06:21:21
  • Fragment 多层嵌套方法调用问题的解决方案

    2023-09-29 08:12:38
  • Java中包装类和Arrays类的详细介绍

    2023-12-03 22:04:13
  • 一文带你搞懂Java中的递归

    2022-10-08 07:34:04
  • 史上最强C语言分支和循环教程详解

    2022-07-01 07:59:35
  • Java中Request请求转发详解

    2021-05-25 20:53:42
  • MFC程序设计常用技巧汇总

    2023-11-02 20:37:12
  • 官方详解HDFS Balancer工具主要调优参数

    2023-07-24 04:43:47
  • jdbc+jsp实现简单员工管理系统

    2021-08-31 23:08:15
  • Android自定义带圆角的ImageView

    2022-12-12 23:48:07
  • java解析Excel的方法(xls、xlsx两种格式)

    2021-10-12 16:29:39
  • Spring Boot整合Web项目常用功能详解

    2023-06-04 17:14:21
  • 分享java中设置代理的两种方式

    2023-10-28 10:48:52
  • mybatis和mybatis-plus同时使用的坑

    2021-07-22 14:03:13
  • asp之家 软件编程 m.aspxhome.com