在 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 方法调用之前)
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
System.out.println("Pre-handle method is calling.");
// 返回 true 表示继续执行请求处理流程,返回 false 则中断请求处理流程
return true;
}
/**
* 在请求处理之后进行调用,但在视图渲染之前(Controller 方法调用之后)
*/
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
System.out.println("Post-handle method is calling.");
}
/**
* 在整个请求处理完成之后进行调用,也就是在视图渲染完成之后
*/
@Override
public 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;
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public 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;
@Controller
public class MyController {
@GetMapping("/hello")
@ResponseBody
public String hello() {
return "Hello, World!";
}
}
方法名 | 调用时机 | 作用 | 返回值 |
---|---|---|---|
preHandle |
在请求处理之前调用,即 Controller 方法调用之前 | 可以进行权限验证、请求参数检查等操作 | 返回 true 表示继续执行请求处理流程,返回 false 则中断请求处理流程 |
postHandle |
在请求处理之后调用,但在视图渲染之前,即 Controller 方法调用之后 | 可以对 ModelAndView 进行修改 | 无 |
afterCompletion |
在整个请求处理完成之后调用,也就是在视图渲染完成之后 | 可以进行资源清理、日志记录等操作 | 无 |
通过以上步骤,我们成功创建了一个 Spring 拦截器类,并将其配置到了 Spring MVC 中。拦截器可以帮助我们在请求处理的不同阶段执行一些额外的逻辑,提高系统的可维护性和安全性。在实际开发中,可以根据具体的需求创建多个拦截器,并按照一定的顺序进行配置。