微信登录

拦截器 - 拦截器定义 - 创建拦截器类

Java - Web - Spring 《拦截器 - 拦截器定义 - 创建拦截器类》

在 Java Web 开发中,Spring 框架为我们提供了丰富的功能,拦截器(Interceptor)就是其中一个非常实用的特性。拦截器可以在请求处理的前后进行一些额外的操作,比如权限验证、日志记录等。本文将详细介绍如何在 Spring 中定义和创建拦截器类。

什么是拦截器

拦截器是 Spring MVC 框架中的一个组件,它可以对控制器方法的调用进行拦截,在请求到达控制器之前或之后执行一些特定的逻辑。拦截器的作用类似于 Servlet 中的过滤器(Filter),但拦截器更专注于 Spring MVC 的请求处理流程。

拦截器的主要应用场景包括:

  • 权限验证:在请求处理之前,检查用户是否具有访问该资源的权限。
  • 日志记录:记录请求的相关信息,如请求的 URL、参数等。
  • 性能监控:统计请求的处理时间,分析系统的性能。

创建拦截器类

在 Spring 中创建拦截器类非常简单,只需要实现 HandlerInterceptor 接口或继承 HandlerInterceptorAdapter 类(该类是 HandlerInterceptor 接口的适配器类,提供了默认的方法实现)。下面是一个具体的示例:

步骤 1:创建拦截器类

  1. import javax.servlet.http.HttpServletRequest;
  2. import javax.servlet.http.HttpServletResponse;
  3. import org.springframework.web.servlet.HandlerInterceptor;
  4. import org.springframework.web.servlet.ModelAndView;
  5. public class MyInterceptor implements HandlerInterceptor {
  6. /**
  7. * 在请求处理之前进行调用(Controller 方法调用之前)
  8. */
  9. @Override
  10. public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
  11. throws Exception {
  12. System.out.println("Pre-handle method is calling.");
  13. // 返回 true 表示继续执行请求处理流程,返回 false 则中断请求处理流程
  14. return true;
  15. }
  16. /**
  17. * 在请求处理之后进行调用,但在视图渲染之前(Controller 方法调用之后)
  18. */
  19. @Override
  20. public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
  21. ModelAndView modelAndView) throws Exception {
  22. System.out.println("Post-handle method is calling.");
  23. }
  24. /**
  25. * 在整个请求处理完成之后进行调用,也就是在视图渲染完成之后
  26. */
  27. @Override
  28. public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
  29. throws Exception {
  30. System.out.println("After-completion method is calling.");
  31. }
  32. }

步骤 2:配置拦截器

在 Spring MVC 中,需要将拦截器配置到 WebMvcConfigurer 中。以下是一个配置示例:

  1. import org.springframework.context.annotation.Configuration;
  2. import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
  3. import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
  4. @Configuration
  5. public class WebConfig implements WebMvcConfigurer {
  6. @Override
  7. public void addInterceptors(InterceptorRegistry registry) {
  8. registry.addInterceptor(new MyInterceptor())
  9. .addPathPatterns("/**") // 拦截所有请求
  10. .excludePathPatterns("/login"); // 排除 /login 请求
  11. }
  12. }

步骤 3:创建控制器

  1. import org.springframework.stereotype.Controller;
  2. import org.springframework.web.bind.annotation.GetMapping;
  3. import org.springframework.web.bind.annotation.ResponseBody;
  4. @Controller
  5. public class MyController {
  6. @GetMapping("/hello")
  7. @ResponseBody
  8. public String hello() {
  9. return "Hello, World!";
  10. }
  11. }

拦截器方法说明

方法名 调用时机 作用 返回值
preHandle 在请求处理之前调用,即 Controller 方法调用之前 可以进行权限验证、请求参数检查等操作 返回 true 表示继续执行请求处理流程,返回 false 则中断请求处理流程
postHandle 在请求处理之后调用,但在视图渲染之前,即 Controller 方法调用之后 可以对 ModelAndView 进行修改 无
afterCompletion 在整个请求处理完成之后调用,也就是在视图渲染完成之后 可以进行资源清理、日志记录等操作 无

总结

通过以上步骤,我们成功创建了一个 Spring 拦截器类,并将其配置到了 Spring MVC 中。拦截器可以帮助我们在请求处理的不同阶段执行一些额外的逻辑,提高系统的可维护性和安全性。在实际开发中,可以根据具体的需求创建多个拦截器,并按照一定的顺序进行配置。