
在 Java Web 开发中,Spring 框架为我们提供了丰富的功能,拦截器(Interceptor)就是其中一个非常实用的特性。拦截器可以在请求处理的前后进行一些额外的操作,比如权限验证、日志记录等。本文将详细介绍如何在 Spring 中定义和创建拦截器类。
拦截器是 Spring MVC 框架中的一个组件,它可以对控制器方法的调用进行拦截,在请求到达控制器之前或之后执行一些特定的逻辑。拦截器的作用类似于 Servlet 中的过滤器(Filter),但拦截器更专注于 Spring MVC 的请求处理流程。
拦截器的主要应用场景包括:
在 Spring 中创建拦截器类非常简单,只需要实现 HandlerInterceptor 接口或继承 HandlerInterceptorAdapter 类(该类是 HandlerInterceptor 接口的适配器类,提供了默认的方法实现)。下面是一个具体的示例:
import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.springframework.web.servlet.HandlerInterceptor;import org.springframework.web.servlet.ModelAndView;public class MyInterceptor implements HandlerInterceptor {/*** 在请求处理之前进行调用(Controller 方法调用之前)*/@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)throws Exception {System.out.println("Pre-handle method is calling.");// 返回 true 表示继续执行请求处理流程,返回 false 则中断请求处理流程return true;}/*** 在请求处理之后进行调用,但在视图渲染之前(Controller 方法调用之后)*/@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,ModelAndView modelAndView) throws Exception {System.out.println("Post-handle method is calling.");}/*** 在整个请求处理完成之后进行调用,也就是在视图渲染完成之后*/@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)throws Exception {System.out.println("After-completion method is calling.");}}
在 Spring MVC 中,需要将拦截器配置到 WebMvcConfigurer 中。以下是一个配置示例:
import org.springframework.context.annotation.Configuration;import org.springframework.web.servlet.config.annotation.InterceptorRegistry;import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;@Configurationpublic class WebConfig implements WebMvcConfigurer {@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(new MyInterceptor()).addPathPatterns("/**") // 拦截所有请求.excludePathPatterns("/login"); // 排除 /login 请求}}
import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.ResponseBody;@Controllerpublic class MyController {@GetMapping("/hello")@ResponseBodypublic String hello() {return "Hello, World!";}}
| 方法名 | 调用时机 | 作用 | 返回值 |
|---|---|---|---|
preHandle |
在请求处理之前调用,即 Controller 方法调用之前 | 可以进行权限验证、请求参数检查等操作 | 返回 true 表示继续执行请求处理流程,返回 false 则中断请求处理流程 |
postHandle |
在请求处理之后调用,但在视图渲染之前,即 Controller 方法调用之后 | 可以对 ModelAndView 进行修改 | 无 |
afterCompletion |
在整个请求处理完成之后调用,也就是在视图渲染完成之后 | 可以进行资源清理、日志记录等操作 | 无 |
通过以上步骤,我们成功创建了一个 Spring 拦截器类,并将其配置到了 Spring MVC 中。拦截器可以帮助我们在请求处理的不同阶段执行一些额外的逻辑,提高系统的可维护性和安全性。在实际开发中,可以根据具体的需求创建多个拦截器,并按照一定的顺序进行配置。