Spring MVC 中实现拦截器功能详解
在 Spring MVC 应用程序中,拦截器(Interceptor)是一种强大的组件,它可以在请求到达控制器之前或之后执行一些通用的处理逻辑,例如日志记录、权限验证、性能监控等。下面将详细介绍如何在 Spring MVC 中实现拦截器功能。
一、创建拦截器类
首先,需要创建一个实现 HandlerInterceptor
接口的类。HandlerInterceptor
接口包含三个方法:
preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
:在请求到达控制器之前被调用。如果返回true
,请求将继续处理;如果返回false
,则请求将被中断,后续的拦截器和控制器都不会被调用。postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView)
:在控制器方法执行之后,视图渲染之前被调用。可以在这个方法中对ModelAndView
进行修改。afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
:在整个请求处理完成之后,包括视图渲染之后被调用。通常用于资源清理等操作。
以下是一个简单的拦截器示例:
import org.springframework.Web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class MyInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("Pre - handle method executed before controller");
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("Post - handle method executed after controller but before view rendering");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("After - completion method executed after view rendering");
}
}
二、配置拦截器
创建拦截器类之后,需要在 Spring MVC 的配置文件中进行配置,将拦截器与特定的 URL 模式关联起来。可以通过继承 WebMvcConfigurer
接口并实现其 addInterceptors
方法来完成配置。
以下是一个配置类的示例:
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 WebMvcConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new MyInterceptor())
.addPathPatterns("/**") // 拦截所有请求
.excludePathPatterns("/login", "/static/**"); // 排除登录页面和静态资源请求
}
}
在上述配置中,addInterceptor
方法注册了我们创建的 MyInterceptor
,addPathPatterns
方法指定了拦截的 URL 模式,excludePathPatterns
方法指定了需要排除的 URL 模式。
三、拦截器的执行顺序
如果配置了多个拦截器,它们的执行顺序如下:
preHandle
方法按照拦截器注册的顺序依次执行。- 如果所有拦截器的
preHandle
方法都返回true
,控制器方法才会被调用。 postHandle
方法按照拦截器注册顺序的逆序执行。afterCompletion
方法同样按照拦截器注册顺序的逆序执行。
通过合理利用拦截器,可以在 Spring MVC 应用中优雅地实现各种通用的处理逻辑,提高代码的复用性和可维护性。
本文链接:https://blog.runxinyun.com/post/592.html 转载需授权!
留言0