SpringMVC Interceptor * 使用教程

作者:qq_19286785 时间:2022-05-11 02:17:22 

SpringMVC中的 * 用于拦截控制器方法的执行,执行在Controller前后,和视图渲染完成后。如下图所示:

SpringMVC Interceptor * 使用教程

一、创建 *

继承HandlerInterceptor 接口,并实现其中的方法

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

SpringMVC中的 * 有三个抽象方法:

preHandle:控制器方法执行之前执行preHandle(),其boolean类型的返回值表示是否拦截或放行,返回true为放行,即调用控制器方法;返回false表示拦截,即不调用控制器方法 postHandle:控制器方法执行之后执行postHandle() afterComplation:处理完视图和模型数据,渲染视图完毕之后执行afterComplation()

二、Spring配置文件中设置

<mvc:interceptors>
       <bean class="com.rzg.interceptor.FirstInterceptor"></bean>
   </mvc:interceptors>

上面的配置等价与下面

<bean id="firstInterceptor" class="com.rzg.interceptor.FirstInterceptor"></bean>
   <mvc:interceptors>
       <ref bean="firstInterceptor"/>
   </mvc:interceptors>

如果只在mvc:interceptors中配置一个 * ,那么所有的请求都经过 * 。以上配置的请求结果如下:

FirstInterceptor===>preHandle
FirstInterceptor===>postHandle
FirstInterceptor===>afterCompletion

如果要对部分控制器进行拦截,可以设置设置interceptor。以下配置将拦截所有的/*请求,例如/hello 、/abc ,但是不拦截/abc/cde。如果要拦截任意请求,使用/**

<bean id="firstInterceptor" class="com.rzg.interceptor.FirstInterceptor"></bean>
<!--     * 的设置-->
   <mvc:interceptors>
      <mvc:interceptor>
      <!--拦截的请求   -->
          <mvc:mapping path="/*"/>  
          <!-- 在mapping中排除以下拦截路径-->
          <mvc:exclude-mapping path="/hello2"/>
          <ref bean="firstInterceptor"/>
      </mvc:interceptor>
   </mvc:interceptors>

结果:

请求/hello FirstInterceptor===>preHandle
FirstInterceptor===>postHandle
FirstInterceptor===>afterCompletion
请求/hello2 不经过 *

三、设置多个 *

两个 * FirstInterceptor、SecondInterceptor。

配置文件中配置:

<mvc:interceptors>
      <mvc:interceptor>
          <mvc:mapping path="/**"/>
          <bean class="com.rzg.interceptor.FirstInterceptor"/>
      </mvc:interceptor>
       <mvc:interceptor>
           <mvc:mapping path="/**"/>
           <bean class="com.rzg.interceptor.SecondInterceptor"/>
       </mvc:interceptor>
   </mvc:interceptors>

请求结果:

FirstInterceptor===>preHandle
SecondInterceptor===>preHandle
SecondInterceptor===>postHandle
FirstInterceptor===>postHandle
SecondInterceptor===>afterCompletion
FirstInterceptor===>afterCompletion

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

此时多个 * 的执行顺序和 * 在SpringMVC的配置文件的配置顺序有关:

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

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

preHandle()返回false和它之前的 * 的preHandle()都会执行,postHandle()都不执行,返回false的 * 之前的 * 的afterComplation()会执行

将SecondInterceptor * preHandle 中返回 false

public class SecondInterceptor implements HandlerInterceptor {
   @Override
   public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
       System.out.println("SecondInterceptor===>preHandle");
   return false;
   }

测试结果:

FirstInterceptor===>preHandle
SecondInterceptor===>preHandle
FirstInterceptor===>afterCompletio

来源:https://blog.csdn.net/qq_19286785/article/details/128665327

标签:SpringMVC,Interceptor, ,
0
投稿

猜你喜欢

  • Java实现断点下载服务端与客户端的示例代码

    2022-07-25 14:16:17
  • c# 使用Task实现非阻塞式的I/O操作

    2023-07-21 23:27:39
  • 浅谈java并发之计数器CountDownLatch

    2023-03-21 23:42:59
  • maven资源过滤打包后文件变大的处理方法

    2023-10-05 21:38:24
  • Spring项目中使用Junit单元测试并配置数据源的操作

    2022-06-02 05:32:27
  • 关于@GetMapping和@GetMapping(value=““)的区别

    2023-11-27 11:07:37
  • java 读取系统Properties代码实例

    2023-02-22 04:21:52
  • Spring Boot Logback配置日志过程解析

    2022-12-09 18:08:06
  • java 图片验证码的实现代码

    2023-11-09 13:33:52
  • Android 5秒学会使用手势解锁功能

    2023-07-11 13:48:32
  • Spring MVC 关于controller的字符编码问题

    2023-06-17 09:52:52
  • Android实现CoverFlow效果控件的实例代码

    2023-06-23 13:12:43
  • 关于ObjectUtils.isEmpty() 和 null 的区别

    2022-05-07 17:10:56
  • Java8之lambda最佳实践_动力节点Java学院整理

    2023-11-28 00:07:28
  • Java数据结构之数组(动力节点之Java学院整理)

    2023-09-23 21:20:12
  • Springboot项目全局异常统一处理案例代码

    2021-08-26 10:51:19
  • java写的伪微信红包功能示例代码

    2023-07-05 00:24:23
  • iOS实现从背景图中取色的代码

    2023-07-06 15:18:32
  • java生成图片验证码实例代码

    2022-01-06 04:01:37
  • android开发仿ios的UIScrollView实例代码

    2023-08-07 01:55:20
  • asp之家 软件编程 m.aspxhome.com