vlambda博客
学习文章列表

主流框架【第11期】--SpringMVC拦截器

主流框架【第11期】--SpringMVC拦截器

导读:

    大家好,我是老田。今天我们梳理SpringMVC的拦截器实现。Spring MVC 提供了 Interceptor 拦截器机制,用于请求的预处理和后处理。

1.拦截器

Spring MVC中的拦截器(Interceptor)类似于Servlet中的过滤器(Filter),它主要用于拦截用户请求并作相应的处理。例如通过拦截器可以进行权限验证、记录请求信息的日志、判断用户是否登录等。

在 Spring MVC 框架中定义一个拦截器需要对拦截器进行定义和配置,主要有以下 2 种方式。

  1. 通过实现 HandlerInterceptor 接口或继承 HandlerInterceptor 接口的实现类(例如 HandlerInterceptorAdapter)来定义;

  2. 通过实现 WebRequestInterceptor 接口或继承 WebRequestInterceptor 接口的实现类来定义。

2.拦截器定义

以实现 HandlerInterceptor 接口的方式自定义拦截器

 package com.tian.demo.interceptor;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import org.springframework.web.servlet.HandlerInterceptor;
 import org.springframework.web.servlet.ModelAndView;
 public class DemoInterceptor implements HandlerInterceptor {
     @Override
     public void afterCompletion(HttpServletRequest request,
                                 HttpServletResponse response, Object handler, Exception ex)
         throws Exception {
         System.out.println("afterCompletion方法在控制器的处理请求方法执行完成后执行,即视图渲染结束之后执行");
    }
     @Override
     public void postHandle(HttpServletRequest request,
                            HttpServletResponse response, Object handler,
                            ModelAndView modelAndView) throws Exception {
         System.out.println("postHandle方法在控制器的处理请求方法调用之后,解析视图之前执行");
    }
     @Override
     public boolean preHandle(HttpServletRequest request,
                              HttpServletResponse response, Object handler) throws Exception {
         System.out.println("preHandle方法在控制器的处理请求方法调用之前执行");
         return false;
    }
 }

HandlerInterceptor 接口的 3 个方法说明如下:

  • preHandle( ):该方法在控制器的处理请求方法前执行,其返回值表示是否中断后续操作,返回 true 表示继续向下执行,返回 false 表示中断后续操作。

  • postHandle( ):该方法在控制器的处理请求方法调用之后、解析视图之前执行,可以通过此方法对请求域中的模型和视图做进一步的修改。

  • afterCompletion( ):该方法在控制器的处理请求方法执行完成后执行,即视图渲染结束后执行,可以通过此方法实现一些资源清理、记录日志信息等工作。

3.拦截器的配置

拦截器在SpringMVC中的配置如下:

 <!-- 配置拦截器 -->
 <mvc:interceptors>
     <!-- 配置一个全局拦截器,拦截所有请求 -->
     <bean class="com.tian.demo.interceptor.DemoInterceptor" />
     <mvc:interceptor>
         <!-- 配置拦截器作用的路径 -->
         <mvc:mapping path="/**" />
         <!-- 配置不需要拦截作用的路径 -->
         <mvc:exclude-mapping path="/login.do" />
         <!-- 定义<mvc:interceptor>元素中,表示匹配指定路径的请求才进行拦截 -->
         <bean class="com.tian.demo.interceptor.DemoInterceptor1" />
     </mvc:interceptor>
     <mvc:interceptor>
         <!-- 配置拦截器作用的路径 -->
         <mvc:mapping path="/demo2" />
         <!-- 定义在<mvc:interceptor>元素中,表示匹配指定路径的请求才进行拦截 -->
         <bean class="com.tian.demo.interceptor.DemoInterceptor2" />
     </mvc:interceptor>
 </mvc:interceptors>

在上述示例代码中,元素说明如下。

  • <mvc:interceptors>:该元素用于配置一组拦截器。

  • <bean>:该元素是 <mvc:interceptors> 的子元素,用于定义全局拦截器,即拦截所有的请求。

  • <mvc:interceptor>:该元素用于定义指定路径的拦截器。

  • <mvc:mapping>:该元素是 <mvc:interceptor> 的子元素,用于配置拦截器作用的路径,该路径在其属性 path 中定义。path 的属性值为/**时,表示拦截所有路径,值为/demo2时,表示拦截所有以/demo2结尾的路径。如果在请求路径中包含不需要拦截的内容,可以通过 <mvc:exclude-mapping> 子元素进行配置。

需要注意的是,<mvc:interceptor> 元素的子元素必须按照 <mvc:mapping.../><mvc:exclude-mapping.../><bean.../> 的顺序配置。



博观而约取,厚积而薄发!



--END--