推荐答案
在 Spring MVC 中,拦截器(Interceptor)可以通过实现 HandlerInterceptor 接口或继承 HandlerInterceptorAdapter 类来创建。拦截器允许你在请求处理之前、之后以及视图渲染之后执行自定义逻辑。
实现步骤
创建拦截器类
创建一个类并实现HandlerInterceptor接口或继承HandlerInterceptorAdapter类。通常需要重写以下方法:preHandle():在请求处理之前执行。postHandle():在请求处理之后、视图渲染之前执行。afterCompletion():在视图渲染之后执行。
// www.javascriptcn.com code example import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class CustomInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { // 在请求处理之前执行 System.out.println("Pre Handle method is Calling"); return true; // 返回 true 继续执行,返回 false 中断请求 } @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 配置类中,通过重写addInterceptors()方法来注册拦截器,并指定拦截的路径。// www.javascriptcn.com code example 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 CustomInterceptor()) .addPathPatterns("/**") // 拦截所有路径 .excludePathPatterns("/admin/**"); // 排除特定路径 } }配置拦截器顺序
如果需要多个拦截器,可以通过order()方法设置拦截器的执行顺序。@Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new FirstInterceptor()).order(1); registry.addInterceptor(new SecondInterceptor()).order(2); }
本题详细解读
拦截器的作用
拦截器是 Spring MVC 提供的一种机制,用于在请求处理的不同阶段插入自定义逻辑。它可以用于以下场景:
- 权限验证:在
preHandle()中检查用户权限。 - 日志记录:在
afterCompletion()中记录请求处理时间。 - 数据预处理:在
postHandle()中对模型数据进行修改。
拦截器与过滤器的区别
- 拦截器:基于 Spring MVC 框架,只能拦截 Spring MVC 处理的请求。
- 过滤器:基于 Servlet 规范,可以拦截所有请求(包括静态资源)。
拦截器的执行流程
- preHandle():在 Controller 方法执行之前调用。如果返回
false,请求将被中断。 - postHandle():在 Controller 方法执行之后、视图渲染之前调用。
- afterCompletion():在视图渲染之后调用,通常用于资源清理。
拦截器的配置
- 路径匹配:通过
addPathPatterns()和excludePathPatterns()方法指定拦截路径。 - 顺序控制:通过
order()方法设置多个拦截器的执行顺序。
注意事项
- 拦截器的
preHandle()方法必须返回true,否则请求将被中断。 - 拦截器的
postHandle()方法在异步请求中不会执行。 - 拦截器的
afterCompletion()方法在请求完成后一定会执行,即使发生异常。
通过合理使用拦截器,可以有效地增强 Spring MVC 应用的功能性和灵活性。