在Spring MVC中,拦截器(Interceptor)是一种用于在请求处理的不同阶段执行特定操作的机制。拦截器可以用于日志记录、权限检查、性能监控等场景。Spring MVC的拦截器类似于Servlet过滤器(Filter),但更灵活且与Spring框架集成更紧密。
拦截器的工作原理
拦截器在请求处理的不同阶段执行,具体包括以下三个方法:
preHandle
:在控制器方法执行之前调用。返回true
继续执行,返回false
中断请求。postHandle
:在控制器方法执行之后、视图渲染之前调用。afterCompletion
:在请求完成之后调用,通常用于资源清理。
如何定义一个拦截器
要定义一个拦截器,需要实现HandlerInterceptor
接口或继承HandlerInterceptorAdapter
类(Spring 5.3之前)。
1. 实现 HandlerInterceptor
接口
import org.springframework.web.servlet.HandlerInterceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class MyInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
// 在控制器方法执行之前调用
System.out.println("Pre Handle method is Calling");
return true; // 继续执行
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
// 在控制器方法执行之后、视图渲染之前调用
System.out.println("Post Handle method is Calling");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
// 在请求完成之后调用
System.out.println("After Completion method is Calling");
}
}
2. 注册拦截器
在Spring配置类中,通过WebMvcConfigurer
接口的addInterceptors
方法注册拦截器。
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new MyInterceptor())
.addPathPatterns("/**") // 拦截所有路径
.excludePathPatterns("/admin/**"); // 排除特定路径
}
}
3. 使用拦截器
拦截器注册后,会自动应用于匹配的请求路径。例如,访问/user
路径时,拦截器的preHandle
、postHandle
和afterCompletion
方法会被依次调用。
拦截器的应用场景
- 日志记录:记录请求和响应的详细信息。
- 权限检查:在
preHandle
中检查用户权限,决定是否继续执行。 - 性能监控:记录请求处理时间。
- 数据预处理:在
preHandle
中对请求数据进行预处理。
总结
- 拦截器:用于在请求处理的不同阶段执行特定操作。
- 定义拦截器:实现
HandlerInterceptor
接口或继承HandlerInterceptorAdapter
类。 - 注册拦截器:通过
WebMvcConfigurer
的addInterceptors
方法注册。
在面试中,理解拦截器的工作原理、定义方式及其应用场景是关键。
THE END
暂无评论内容