1.拦截器(Interceptor)
(1)拦截器概念
拦截器是一种动态拦截方法调用的机制,在SpringMVC中动态拦截控制器方法的执行
(2)拦截器作用
在指定的方法调用前后执行预先设定的代码和阻止原始方法的执行
(3)拦截器执行顺序
2.拦截器参数
参数 | 描述 |
---|---|
HttpServletRequest request | 请求对象 |
HttpServletResponse response | 响应对象 |
Object handler | 被调用的处理器对象,本质上是一个方法对象,对反射技术中的Method对象进行了再包装 |
ModelAndView modelAndView | 如果处理器执行完成具有返回结果,可以读取到对应数据和页面信息,并进行调整 |
Exception ex | 如果处理器执行过程中出现异常对象,可以针对异常情况进行单独处理 |
3.拦截器代码案例
(1)定义一个拦截器
定义一个类实现HandlerInterceptor接口
java
package controller;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@Component // 自定义拦截器需要被SpringMVC配置类扫描到
public class ExampleInterceptor implements HandlerInterceptor {
// 在原始方法之前执行的代码,其返回值表示是否执行原始方法中的代码
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("在原始方法之前执行的代码");
return true;
}
// 在原始方法之后执行的代码
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("在原始方法之后执行的代码");
}
// 在postHandle之后执行的代码
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("在postHandle之后执行的代码");
}
}
(2)设置拦截器拦截的控制器
实现WebMvcConfigurer接口的void addInterceptors(InterceptorRegistry registry)方法
java
package config;
import controller.ExampleInterceptor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
@ComponentScan("controller")
@EnableWebMvc
public class SpringMvcConfig implements WebMvcConfigurer{
@Autowired
private ExampleInterceptor exampleInterceptor;
// 定义具体的拦截器配置
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(exampleInterceptor)// 添加拦截器
.addPathPatterns("/demo");// 该拦截器拦截的请求
}
}
4.拦截器链
配置多个拦截器时,会形成拦截器链。拦截器链的运行顺序参照拦截器添加顺序为准。当拦截器中出现对控制器的拦截,该拦截器后续执行会终止但不影响前面拦截器的后续执行