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


在Spring Boot中,拦截器(Interceptor)是一种强大的机制,用于在请求被处理之前或之后、以及响应发送给客户端之后执行自定义的代码。这对于日志记录、身份验证、权限检查、请求处理时间统计等场景尤为有用。作为一名高级程序员,理解并熟练掌握Spring Boot中的拦截器机制是必不可少的。 ### 1. 定义拦截器 首先,我们需要定义一个实现了`HandlerInterceptor`接口的类。这个接口定义了三个方法:`preHandle`、`postHandle`和`afterCompletion`,分别对应请求处理前、请求处理后但视图被渲染前(如果有的话)、以及整个请求结束后执行的逻辑。 ```java 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`方法来实现的。 ```java 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. 深入理解与应用 - **路径匹配**:在`addPathPatterns`和`excludePathPatterns`中,你可以精细控制哪些路径被拦截器拦截,哪些路径被排除。 - **顺序控制**:如果有多个拦截器,它们的执行顺序可以通过`InterceptorRegistry`的添加顺序来控制。先添加的拦截器会先执行。 - **性能考虑**:虽然拦截器功能强大,但也要注意不要在其中执行过于耗时的操作,以免影响系统性能。 - **灵活应用**:根据具体业务需求,拦截器可以应用于多种场景,如身份验证、日志记录、请求参数校验等。 ### 4. 总结 在Spring Boot中使用拦截器是处理HTTP请求的一种高效方式。通过定义拦截器类并实现`HandlerInterceptor`接口,再将其注册到Spring MVC的配置中,我们可以轻松地在请求处理流程中的不同阶段执行自定义逻辑。这对于提升应用的安全性、可维护性和可扩展性具有重要意义。在码小课网站上,我们鼓励学习者深入理解Spring Boot的拦截器机制,并通过实践掌握其应用技巧,以提升自身的开发能力。
推荐面试题