Spring Boot 中的拦截器 Interceptors

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 对象以及需要在请求生命周期特定点发生的其他操作。
请登录后发表评论

    没有回复内容