当前位置: 面试刷题>> 在 Spring Boot 中你是怎么使用拦截器的?


在Spring Boot中,拦截器(Interceptor)是一种强大的机制,用于在请求被处理之前或之后、以及响应发送给客户端之后执行自定义的代码。这对于日志记录、身份验证、权限检查、请求处理时间统计等场景尤为有用。作为一名高级程序员,理解并熟练掌握Spring Boot中的拦截器机制是必不可少的。

1. 定义拦截器

首先,我们需要定义一个实现了HandlerInterceptor接口的类。这个接口定义了三个方法:preHandlepostHandleafterCompletion,分别对应请求处理前、请求处理后但视图被渲染前(如果有的话)、以及整个请求结束后执行的逻辑。

import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@Component
public class MyInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        // 在请求处理之前进行调用(Controller方法调用之前)
        // 返回true表示继续流程(如调用下一个拦截器或处理器);
        // 返回false表示流程中断,不会继续调用其他的拦截器或处理器,此时我们需要通过response来产生响应;
        System.out.println("Pre-Handle Called");
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        // 请求处理之后进行调用,但是在视图被渲染之前(Controller方法调用之后)
        // 可以通过此方法对Controller处理之后的ModelAndView对象进行操作
        System.out.println("Post-Handle Called");
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        // 在整个请求结束之后被调用,也就是在DispatcherServlet渲染了对应的视图执行后
        // 主要用于进行资源清理工作
        System.out.println("After-Completion Called");
    }
}

2. 注册拦截器

定义好拦截器之后,我们需要将其注册到Spring MVC的拦截器链中。这通常是通过实现WebMvcConfigurer接口并覆盖其addInterceptors方法来实现的。

import org.springframework.beans.factory.annotation.Autowired;
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 {

    @Autowired
    private MyInterceptor myInterceptor;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // 添加拦截器,并设置其拦截的路径和排除的路径
        registry.addInterceptor(myInterceptor)
                .addPathPatterns("/**") // 拦截所有请求
                .excludePathPatterns("/static/**", "/error"); // 排除静态资源请求和错误页面
    }
}

3. 深入理解与应用

  • 路径匹配:在addPathPatternsexcludePathPatterns中,你可以精细控制哪些路径被拦截器拦截,哪些路径被排除。
  • 顺序控制:如果有多个拦截器,它们的执行顺序可以通过InterceptorRegistry的添加顺序来控制。先添加的拦截器会先执行。
  • 性能考虑:虽然拦截器功能强大,但也要注意不要在其中执行过于耗时的操作,以免影响系统性能。
  • 灵活应用:根据具体业务需求,拦截器可以应用于多种场景,如身份验证、日志记录、请求参数校验等。

4. 总结

在Spring Boot中使用拦截器是处理HTTP请求的一种高效方式。通过定义拦截器类并实现HandlerInterceptor接口,再将其注册到Spring MVC的配置中,我们可以轻松地在请求处理流程中的不同阶段执行自定义逻辑。这对于提升应用的安全性、可维护性和可扩展性具有重要意义。在码小课网站上,我们鼓励学习者深入理解Spring Boot的拦截器机制,并通过实践掌握其应用技巧,以提升自身的开发能力。

推荐面试题