拦截器的相关知识(Spring MVC)

本章主要介绍的知识点如下:

  • 拦截器定义和配置方式。
  • 熟悉拦截器的执行流程。
  • 拦截器的使用。

拦截器概述

Spring MVC中的拦截器类似于Servlet中的过滤器,它主要用于拦截用户请求并作出相应的处理。例如通过拦截器可以进行权限验证、判断用户是否已登陆等。

14.1.1 拦截器的定义
要使用Spring MVC中的拦截器,就需要对拦截器类进行定义和配置。通常拦截器类可以通过两种方式来定义:
•  一种是通过实现 HandlerInterceptor接口或者继承HandlerInterceptor接口的实现类(如HandlerInterceptorAdapter)来定义。
•  另一种是通过实现 WebRequestInterceptor接口或继承WebRequestInterceptor接口的实现类来定义。
以实现HandlerInterceptor接口的定义方式为例,自定义拦截器类的代码如下所示。


从上述代码可以看出,自定义的拦截器类实现了HandlerInterceptor接口,并实现了接口中的3个方法。关于这3个方法的具体描述如下。
•  preHandle()方法:该方法会在控制器方法前执行,其返回值表示是否中断后续操作。当其返回值为true时,表示继续向下执行;当其返回值为false时,会中断后续的所有操作(包括调用下一个拦截器和控制器类中的方法执行等)。
•  postHandle()方法:该方法会在控制器方法调用之后,且解析视图之前执行。可以通过此方法对请求域中的模型和视图做出进一步的修改。
•  afterCompletion()方法:该方法在整个请求完成,即视图渲染结束之后执行。可以通过此方法实现一些资源清理、记录日志信息等工作。
14.1.2 拦截器的配置
要使自定义的拦截器类生效,需要在Spring MVC的配置文件中进行配置,配置代码如下所示。
在这里插入图片描述

在上述代码中,mvc:interceptors元素用于配置一组拦截器,其子元素中定义的是全局拦截器,它会拦截所有的请求;而mvc:interceptor元素中定义的是指定路径的拦截器,它会对指定路径下的请求生效。mvc:interceptor元素的子元素mvc:mapping用于配置拦截器作用的路径,该路径在其属性path中定义。如上述代码中path的属性值“/**”表示拦截所有路径,“/hello”表示拦截所有以“hello”结尾的路径。如果在请求路径中包含不需要拦截的内容,还可以通过mvc:exclude-mapping元素进行配置。
注意
<mvc: interceptor>中的子元素必须按照上述代码的配置顺序进行编写,即<mvc: mapping…/>→<mvc: exclude-mapping…/>→<bean…/>的顺序,否则文件会报错。

14.2 拦截器的执行流程
拦截器的执行是有一定顺序的,该顺序与配置文件中所定义的拦截器的顺序相关。本节将对单个拦截器的执行流程和多个拦截器的执行流程进行讲解。
14.2.1 单个拦截器的执行流程
如果在项目中只定义了一个拦截器,那么该拦截器在程序中的执行流程如图14.1所示。从中可以看出,程序首先会执行拦截器类中的preHandle()方法,如果该方法的返回值为true,则程序就会继续向下执行处理器中的方法,否则将不再向下执行;在业务处理器(即控制器Controller类)处理完请求后,会执行postHandle()方法,然后通过DispatcherServlet向客户端返回响应;在DispatcherServlet处理完请求后,才会执行afterCompletion()方法。
【示例14-1】下面通过一个案例来演示拦截器的执行流程。
步骤01 在Eclipse中创建一个名为chapter14的Web项目,将Spring MVC程序运行所需的JAR包复制到项目的lib目录中,并发布到类路径下。
步骤02 在web.xml中配置Spring MVC的前端过滤器和初始化加载配置文件等信息。
步骤03 在src目录下创建一个com.ssm.controller包,并在包中创建控制器类 HelloController,编辑后的代码如文件14.1所示。


图14.1 单个拦截器的执行流程
文件14.1 HelloController.java
在这里插入图片描述

步骤04 在src目录下创建一个com.ssm.interceptor包,并在包中创建拦截器类UserInterceptor。该类需要实现 HandlerInterceptor接口,并且在实现方法中需要编写输出语句来输出信息,如文件14.2所示。
文件14.2 UserInterceptor.java
在这里插入图片描述

步骤05 在src目录下创建并配置Spring MVC的配置文件,如文件14.3所示。
文件14.3 springmvc-config.xml
在这里插入图片描述

由于配置拦截器使用的是<mvc: interceptors>元素,因此需要配置mvc的schema信息。本案例演示的是单个拦截器的执行顺序,所以这里只配置了一个全局的拦截器。
步骤06 在WEB-INF目录下创建一个jsp文件夹,并在该文件夹中创建一个页面文件success.jsp,然后在页面文件的元素内编写任意显示信息,如“ok,执行成功!”。
步骤07 发布并启动项目,在浏览器中访问地址http://localhost:8080/chapter14/hello,程序正确执行后,浏览器会跳转到success.jsp页面,此时控制台的输出结果如图14.2所示。从图14.2中可以看出,程序先执行了拦截器类中的preHandle()方法,然后执行了控制器中的Hello()方法,最后分别执行了拦截器类中的postHandle()方法和afterCompletion()方法,这与前文描述的单个拦截器的执行顺序是一致的。
在这里插入图片描述

图14.2 运行结果
14.2.2 多个拦截器的执行流程
在大型项目中,通常会定义很多拦截器来实现不同的功能。多个拦截器的执行顺序如图14.3所示。这里假设有两个拦截器Interceptor1和Interceptor2,并且在配置文件中,Interceptor1拦截器配置在前。
在这里插入图片描述

图14.3 多个拦截器的执行流程
从图14.3可以看出,当有多个拦截器同时工作时,它们的preHandle()方法会按照配置文件中拦截器的配置顺序执行,而它们的postHandle()方法和afterCompletion()方法则会按照配置顺序的反序执行。
【示例14-2】为了验证上述描述,下面修改14.2.1小节的案例来演示多个拦截器的执行。
步骤01 在com.ssm.interceptor包中创建两个拦截器类Interceptor1和Interceptor2,这两个拦截器类均实现了HandlerInterceptor接口,并重写其中的方法,如文件14.4和文件14.5所示。
文件14.4 Interceptor1.java
在这里插入图片描述

文件14.5 Interceptor2.java


步骤02 在配置文件springmvc-config.xml中的mvc:interceptors元素内配置上面所定义的两个拦截器,配置代码如下所示。
在这里插入图片描述

在上述拦截器的配置代码中,第一个拦截器会作用于所有路径下的请求,而第二个拦截器会作用于以“/hello”结尾的请求。
注意
为了不影响程序的输出结果,可先注释掉14.2.1小节案例中的配置。
步骤03 发布并启动项目,在浏览器中访问地址http://localhost:8080/chapter14/hello,程序正确执行后,浏览器会跳转到success.jsp页面,此时控制台的输出结果如图14.4所示。
从图14.4中可以看出,程序先执行了前两个拦截器类中的preHandle()方法,这两个方法的执行顺序与配置文件中定义的顺序相同;然后执行了控制器类中的helo()方法;最后执行了两个拦截器类中的postHandle()方法和afterCompletion()方法,且这两个方法的执行顺序与配置文件中所定义的拦截器顺序相反。
在这里插入图片描述

图14.4 运行结果

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值