后端——框架——视图层框架——spring_mvc——《官网》阅读笔记——第一章节4(核心对象,拦截器)

1、概念

  拦截器是由Spring提供,类似Filter功能的类,它可以拦截DispatcherServlet分发的请求。

  与Filter不同之处在于,Filter适用于所有Servlet,而拦截器(Interceptor)只适用于DispatcherServlet分发的请求。当同时有Filter,Interceptor存在的情况下,请求的执行链如下:

  Filter chain---->DispatcherServlet的doService方法------>获取HandlerExecutionChain,执行HandlerInterceptor chain----->Controller中的handler方法。

2、HandlerInterceptor接口

  HandlerInterceptor有三个方法,

  1. preHandle:在Controller的handler方法之前执行,返回true时继续执行下一个Handler,若是最后一个Handler,则执行Controller中的方法。返回false时,表示请求终止,不会有任何后续。
  2. postHandle:在Controller的handler方法之后执行,当响应类型为数据流时,即直接向response对象的输出流写入数据时,例如调用response.getWriter.append方法,标注有@ResponseBody的handler。此方法不会执行。
  3. afterCompletion:在请求结束,响应关闭,线程资源被回收之后运行

3、使用

  使用拦截器有两个步骤:

  1. 自定义HandlerInterceptor接口的实现类,例如TestInterceptor。
  2. 注册HandlerInterceptor,注册的方式有两种,代码方式,在配置文件中配置。

  编写HandlerInterceptor接口的实现类较为简单。只做练习的话,打印几条输出语句即可。

  注册的代码方式:

  实现WebMvcConfigurer接口,重写addInterceptors方法,参数为InterceptorRegistry,它是拦截注册器。代码如下:

public void addInterceptors(InterceptorRegistry registry) {
	// 调用InterceptorRegistry的addInterceptor方法
	// 拦截所有的请求,除login
	registry.addInterceptor(new TestInterceptor()).
       addPathPatterns("/**").excludePathPatterns("/login");
}

  注册的配置方式:在spring-mvc.xml中配置mvc:interceptors标签

<mvc:interceptor>
	<mvc:mapping path="/**"/>
	<mvc:exclude-mapping path="/login"/>
	<bean class="interceptor.TestInterceptor"/>
</mvc:interceptor>
原文地址:https://www.cnblogs.com/rain144576/p/12903087.html