目录
前言
在Spring Boot中,拦截器(interceptor)是一种用于拦截和处理请求的机制。通过拦截器,可以在请求到达控制器之前,响应发送到客户端之前进行一些预处理或后处理操作
拦截器的使用
1.创建一个拦截器
要使用拦截器,首先需要创建一个实现‘HandlerInterceptor’接口的类。这个类中包含三个主要方法
- preHandler:在请求处理之前执行。可以用于验证权限,日志记录等。
- postHandler:在请求处理之后,视图渲染之前执行。可以用于修改‘ModelAndView’,添加一些全局的数据。
- afterCompletion:在整个请求结束之后执行。可以用于记录日志,清理资源等。
以下是一个简单的拦截器示例:
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@Slf4j
public class MyInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
log.info("开始请求辣");
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
log.info("我是请求后");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
log.info("我是请求完成");
}
}
2.注册拦截器
创建好拦截器后,你需要将它注册到 Spring 的拦截器链中。通常在配置类中实现 WebMvcConfigurer
接口,并在其中注册拦截器。
import org.springframework.beans.factory.annotation.Autowired;
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 {
@Autowired
private MyInterceptor myInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(myInterceptor)
.addPathPatterns("/api/**") // 指定拦截路径
.excludePathPatterns("/api/auth/**"); // 指定不拦截路径
}
}
3.配置拦截器的匹配规则
在注册拦截器时,可以通过 addPathPatterns
和 excludePathPatterns
方法来配置拦截器的路径匹配规则:
addPathPatterns("/api/**")
:拦截所有以/api/
开头的请求路径。excludePathPatterns("/api/auth/**")
:排除以/api/auth/
开头的路径,不进行拦截。
输出结果
拦截器的实际使用场景
拦截器可以用于多种场景,例如:
- 认证与授权:在
preHandle
方法中验证请求是否包含有效的身份验证信息,若不合法则直接返回错误响应。- 日志记录:在
postHandle
或afterCompletion
方法中记录请求的执行情况、处理时间等日志信息。- 全局数据注入:在
postHandle
方法中向ModelAndView
中添加一些全局的数据,如当前用户信息、系统时间等。
拦截器 vs 过滤器 vs AOP
- 拦截器(Interceptor):基于 Spring MVC,主要用于拦截和处理控制器的请求,适合对请求的前后进行处理。
- 过滤器(Filter):基于 Servlet,是更底层的机制,适用于所有的请求(包括静态资源等),常用于全局性的请求处理,如编码设置、跨域处理等。
- AOP(面向切面编程):用于横切关注点的处理,如事务管理、日志记录等,可以在方法执行前后进行增强处理,不限于 HTTP 请求。
总结
在 Spring Boot 中,拦截器是一种非常强大的机制,用于在请求处理流程的不同阶段执行特定的逻辑。通过灵活地配置拦截器的匹配规则,你可以精确地控制拦截器的作用范围,为应用添加认证、日志、性能监控等功能。