Spring Boot 拦截器是一种强大的机制,用于拦截应用程序中的 HTTP 请求和响应。
它们是 Spring Web MVC 框架的一部分,允许你在控制器处理请求之前和之后执行操作。
创建拦截器
要创建一个拦截器,你需要实现 HandlerInterceptor 接口或扩展 HandlerInterceptorAdapter 类。
@Slf4j
@Component
public class LoggingInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
log.info("Request URL: " + request.getRequestURL());
log.info("Request Method: " + request.getMethod());
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
// Can log response details here
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception exception) throws Exception {
// Can log completion details here
log.info("Request Process completed");
}
}
@Slf4j
@Component
public class ProductInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
log.info("Request URL: " + request.getRequestURL());
log.info("Request Method: " + request.getMethod());
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
// Can log response details here
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception exception) throws Exception {
// Can log completion details here
log.info("Request Process completed");
}
}
注册拦截器
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Autowired
private LoggingInterceptor loggingInterceptor;
@Autowired
private ProductInterceptor productInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(loggingInterceptor)
.addPathPatterns("/api/**") // Define the URL patterns to be intercepted
.excludePathPatterns("/api/auth/**"); // Define the URL patterns to be excluded from interception
registry.addInterceptor(productInterceptor)
.addPathPatterns("/product/**") // Define the URL patterns to be intercepted
.excludePathPatterns("/api/auth/**");
}
}
@RestController
@RequestMapping("/api")
@Slf4j
public class CustomerController {
@GetMapping
public String getMessage(){
log.info("getMessage()");
return "welcomoe to the interceptors session";
}
}
@RestController
@RequestMapping("/product")
@Slf4j
public class ProductController {
@GetMapping
public String getProduct(){
log.info("getProduct()");
return "product information";
}
}
拦截器的生命周期
preHandle:在实际处理器执行之前调用。该方法可用于预处理(例如,日志记录、认证等)。如果返回 `false`,则执行链将被中断。
postHandle: 在处理器执行之后但在 `ModelAndView` 渲染之前调用。该方法可用于在渲染之前修改 `ModelAndView`。
afterCompletion:在整个请求完成后调用。该方法可用于清理活动。
过滤器和拦截器都是用于处理 Spring Boot 应用程序中的 HTTP 请求和响应的机制,但它们在不同的层次上运行并服务于不同的目的。以下是它们之间的主要区别:
过滤器
- 生命周期
- 过滤器是 Servlet API 的一部分,可以在 web.xml 文件中或通过 Spring Boot 应用程序中的注解进行配置。
- 过滤器应用于所有传入请求,可用于任务如认证、日志记录和输入验证。
- 执行点:
- 过滤器在请求处理之前和之后执行,包括分派到 servlet 或控制器。
- 范围:
- 过滤器可以应用于所有或特定的 URL 模式。
- 它们在请求到达 servlet 或控制器之前在最低级别工作。
- 配置方法:
- 过滤器使用 `@WebFilter` 注解或通过在 `FilterRegistrationBean` 中注册为 bean 进行配置。
- 使用场景:
- 通常用于横切关注点,如安全、日志记录和输入/输出过滤。
拦截器
- 生命周期:
- 拦截器是 Spring MVC 框架的一部分,使用 Spring 的配置类进行配置。
- 拦截器用于在控制器方法执行之前和之后执行操作。
- 执行点:
- 拦截器在请求生命周期的三个不同点执行:在控制器方法之前(preHandle),在控制器方法之后但在视图渲染之前(postHandle),以及在整个请求完成后(afterCompletion)。
- 范围:
- 拦截器可以应用于所有或特定的 URL 模式,并且可以按链式顺序排列。
- 它们在更高级别工作,与处理器(控制器)和视图交互。
- 配置方法:
- 拦截器通过实现 HandlerInterceptor 接口并在实现 WebMvcConfigurer 的配置类中注册进行配置。
- 应用场景:
- 通常用于任务如日志记录、安全检查、修改 ModelAndView 对象以及需要在请求生命周期特定点发生的其他操作。
没有回复内容