千家信息网

SpringBoot拦截器怎么用

发表于:2026-11-04 作者:千家信息网编辑
千家信息网最后更新 2026年11月04日,今天小编给大家分享一下SpringBoot拦截器怎么用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一
千家信息网最后更新 2026年11月04日SpringBoot拦截器怎么用

今天小编给大家分享一下SpringBoot拦截器怎么用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。

HandlerInterceptor 详解

HandlerInterceptor 允许定制 handler 处理器执行链的工作流接口。我们可以自定义拦截器用于拦截 handlers 处理器(你可以理解为 controller 层的接口),从而可以添加一些共同的重复性的处理行为(例如接口鉴权,接口日志记录,性能监控等),而不用修改每一个 handler 的实现。

注意,此基于 SpringBoot 2.3.12.RELEASE 版本讲解。

HandlerInterceptor 接口只有三个默认空实现方法,在低版本中这三个方法不是默认方法,而是抽象方法。

public interface HandlerInterceptor {        default boolean preHandle(HttpServletRequest request, HttpServletResponse response,                 Object handler) throws Exception {                return true;        }        default void postHandle(HttpServletRequest request, HttpServletResponse response,                 Object handler, @Nullable ModelAndView modelAndView) throws Exception {        }        default void afterCompletion(HttpServletRequest request, HttpServletResponse response,             Object handler, @Nullable Exception ex) throws Exception {        }}

这三个方法的执行顺序图如下:

preHandle

preHandle 前置处理,拦截一个处理器(handler)的执行,preHandle 方法会在 HandlerMapping 确定一个适当的处理器对象之后,但在 HandlerAdapter 调用处理器之前被调用。可以简单理解为 controller 接口被调用之前执行。

Intercepter 是链式的,就是一个接着一个执行。如果此方法返回 true,则会执行下一个拦截器或者直接执行处理器。如果此方法返回 false 或者抛出异常则终止执行链,也不再调用处理器。

注意,此方法如果不返回 true,那么 postHandle 和 afterCompletion 不会被执行。

那这个方法有什么用呢?其实可以做一些接口被调用前的预处理,例如用户权限校验。

package com.chenpi;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.springframework.lang.Nullable;import org.springframework.stereotype.Component;import org.springframework.web.method.HandlerMethod;import org.springframework.web.servlet.HandlerInterceptor;/** * @Description 用户权限验证拦截 * @Author 陈皮 * @Date 2021/6/27 * @Version 1.0 */@Componentpublic class UserPermissionInterceptor implements HandlerInterceptor {    @Override    public boolean preHandle(HttpServletRequest request, HttpServletResponse response,            Object handler) {        if (handler instanceof HandlerMethod) {            HandlerMethod handlerMethod = (HandlerMethod) handler;            // 获取用户权限校验注解            UserAuthenticate userAuthenticate =                    handlerMethod.getMethod().getAnnotation(UserAuthenticate.class);            if (null == userAuthenticate) {                userAuthenticate = handlerMethod.getMethod().getDeclaringClass()                        .getAnnotation(UserAuthenticate.class);            }            if (userAuthenticate != null && userAuthenticate.permission()) {                // 验证用户信息                UserContext userContext = userContextManager.getUserContext(request);                if (null == userContext) {                    return false;                }            }        }        return true;    }}

postHandle

postHandle 后置处理,会在 HandlerAdapter 调用处理器之后,但在 DispatcherServlet 渲染视图之前被调用。可以在此对 ModelAndView 做一些额外的处理。可以简单理解为 controller 接口被调用之后执行。

注意,此方法在执行链中的执行顺序是倒着执行的,即先声明的拦截器后执行。

afterCompletion

afterCompletion 完成之后,在请求处理完之后被执行,也就是渲染完视图之后。一般用于做一些资源的清理工作,配合 preHandle 计算接口执行时间等。

注意,和 postHandle 一样,此方法在执行链中的执行顺序也是倒着执行的,即先声明的拦截器后执行。

@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response,                            Object handler, @Nullable Exception ex) {    // 请求完后,清除当前线程的用户信息    UserContextHolder.removeUserContext();}

注册拦截器

注意,我们自定义的拦截器要通过 WebMvcConfigurer 的实现类进行注册,才能生效。

package com.yzj.ehr.common.config;import com.yzj.ehr.common.context.UserContextResolver;import org.springframework.stereotype.Component;import org.springframework.web.method.support.HandlerMethodArgumentResolver;import org.springframework.web.servlet.config.annotation.InterceptorRegistry;import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;import com.yzj.ehr.common.interceptor.UserPermissionInterceptor;/** * @Description 注册拦截器 * @Author 陈皮 * @Date 2021/6/27 * @Version 1.0 */@Componentpublic class WebAppConfigurer implements WebMvcConfigurer {    private UserPermissionInterceptor userPermissionInterceptor;    public WebAppConfigurer(final UserPermissionInterceptor userPermissionInterceptor) {        this.userPermissionInterceptor = userPermissionInterceptor;    }    @Override    public void addInterceptors(InterceptorRegistry registry) {        // 匹配所有接口,排除/base/test接口        registry.addInterceptor(userPermissionInterceptor).addPathPatterns("/**")                .excludePathPatterns("/base/test");    }}

以上就是"SpringBoot拦截器怎么用"这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注行业资讯频道。

处理 接口 拦截器 处理器 方法 此方法 用户 知识 篇文章 三个 权限 顺序 信息 内容 就是 版本 视图 陈皮 工作 验证 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 广州紫鲸互联网科技有限公司 河南真二互联网科技有限公司 互联网的科技创新 互联网金融科技平台 一五八零互联网科技 左右互联网络科技 安控科技rtu产品工业互联网 互联网科技中介 字节跳动和互联网科技 互联网科技公司有风险吗 互联网科技大奖都有哪些公司 青海科技产业互联网发展 如何创新互联网科技 互联网公司黑科技创始人 东莞新华互联网科技学校 互联网在线教育科技创业 上海京穆互联网科技有限公司 南通创西澳互联网科技有限公司 北京天晋互联网科技有限公司 现代科技的标志之一的互联网 亿人帮互联网科技有限公司 互联网科技小额贷款 互联网科技咨询 互联网汽车科技小镇 互联网科技公司需要的职位 威龙国际互联网科技公司 世界互联网领先科技成果获奖 上海京穆互联网科技有限公司 锡山区互联网智能科技产品供应 求路客互联网科技电话
0