微信登录

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

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 中。拦截器可以帮助我们在请求处理的不同阶段执行一些额外的逻辑,提高系统的可维护性和安全性。在实际开发中,可以根据具体的需求创建多个拦截器,并按照一定的顺序进行配置。

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