面试题:Spring MVC 中的拦截器是什么?如何定义一个拦截器?

在Spring MVC中,拦截器(Interceptor)是一种用于在请求处理的不同阶段执行特定操作的机制。拦截器可以用于日志记录、权限检查、性能监控等场景。Spring MVC的拦截器类似于Servlet过滤器(Filter),但更灵活且与Spring框架集成更紧密。

拦截器的工作原理

拦截器在请求处理的不同阶段执行,具体包括以下三个方法:

  1. preHandle:在控制器方法执行之前调用。返回true继续执行,返回false中断请求。
  2. postHandle:在控制器方法执行之后、视图渲染之前调用。
  3. afterCompletion:在请求完成之后调用,通常用于资源清理。

如何定义一个拦截器

要定义一个拦截器,需要实现HandlerInterceptor接口或继承HandlerInterceptorAdapter类(Spring 5.3之前)。

1. 实现 HandlerInterceptor 接口

import org.springframework.web.servlet.HandlerInterceptor;
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 is Calling");
        return true; // 继续执行
    }

    @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");
    }
}

2. 注册拦截器

在Spring配置类中,通过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 WebConfig implements WebMvcConfigurer {

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new MyInterceptor())
                .addPathPatterns("/**") // 拦截所有路径
                .excludePathPatterns("/admin/**"); // 排除特定路径
    }
}

3. 使用拦截器

拦截器注册后,会自动应用于匹配的请求路径。例如,访问/user路径时,拦截器的preHandlepostHandleafterCompletion方法会被依次调用。

拦截器的应用场景

  1. 日志记录:记录请求和响应的详细信息。
  2. 权限检查:在preHandle中检查用户权限,决定是否继续执行。
  3. 性能监控:记录请求处理时间。
  4. 数据预处理:在preHandle中对请求数据进行预处理。

总结

  • 拦截器:用于在请求处理的不同阶段执行特定操作。
  • 定义拦截器:实现HandlerInterceptor接口或继承HandlerInterceptorAdapter类。
  • 注册拦截器:通过WebMvcConfigureraddInterceptors方法注册。

在面试中,理解拦截器的工作原理、定义方式及其应用场景是关键。

THE END
点赞9 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容