Spring Boot 拦截器

拦截器是Spring 框架提供的核心功能之一,主要用于拦截用户的请求,在指定方法的前后根据业务需要执行代码。

例如登录场景,有可能我们访问一个网页时,我们的登录信息过期了,就需要重新登录,那么就可使用拦截器,在用户执行操作之前,检查登录状态。

1. 定义拦截器

自定义拦截器:实现HandlerInterceptor接口

java 复制代码
@Slf4j
@Component
public class LoginInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        //true代表通过,false代表拦截
        //log.info("目标方法执行前执行");
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        //log.info("目标方法执行后执行");
    }
}

2. 注册拦截器

实现WebMvcConfigurer接口,重新addInterceptors方法

java 复制代码
@Configuration
public class WebConfig implements WebMvcConfigurer {
    //自定义拦截对象
    @Autowired
    LoginInterceptor loginInterceptor;
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        //注册自定义拦截对象
        registry.addInterceptor(loginInterceptor)
                //设置拦截器生效路径,代表url中的路径,/**代表所有路径
                .addPathPatterns("/**")
                //排除路径
                .excludePathPatterns("/user/login")
//                .excludePathPatterns("/static/**"); //不能直接使用static/**
                //需要把静态文件排除
                .excludePathPatterns("/css/**")
                .excludePathPatterns("/js/**")
                .excludePathPatterns("/pic/**")
                .excludePathPatterns("/**/*.html");
    }
}

3. 拦截器工作流程

当Spring项目启动后,我们访问接口时,会通过一个核心的类:DispatcherServlet 来控制执行流程。

3.1 初始化

当启动Spring项目后,第一次访问某个接口时,会执行DispatcherServlet的初始化方法 init(),DispatcherServlet并没有重父类HttpServletBean中的init()方法,其初始化是在父类的init()方法中完成的:

其中调用了 initServletBean(),它是在FrameworkServlet中实现的,主要作用是建立WebApplicationContext容器(上下文),并加载SpringMVC配置文件中定义的Bean到该容器中,最后将该容器添加到ServletContext中:

这里就可以看到我们控制台打印出的日志信息。

然后在initWebApplicationContext()方法中调用了 onRefresh()方法,初始化Spring9大组件

3.2 处理请求

接收到请求后,会先执行 DispatcherServlet中的 doService()方发中的doDispatch() 调度方法,再将请求转给Controller:

这里就可以看到, 先执行了拦截器的 preHandle相关方法,在执行了目标方法,然后执行了拦截器的postHandle方法。

相关推荐
程序员贺加贝12 小时前
别把 ThreadLocal 写进 Serializer:一次 SaaS 多租户 Jackson 上下文污染排查
java·spring boot
许彰午12 小时前
06-EaEngine调度器
java·低代码·架构
计算机魔术师12 小时前
我看了 Hugging Face 的 Daily Papers,发现这件事
前端
evans在进步13 小时前
Spring Boot 工程化核心详解:Parent、Starter、热部署、事务与多数据源
spring boot·后端·python
卓怡学长13 小时前
w181springboot机场乘客服务系统
java·数据库·spring boot·spring·intellij-idea
萧瑟余晖13 小时前
Java深入解析篇三十九之集成测试
java·开发语言·集成测试
yu俞娥宝13 小时前
Codex官网前端可抄吗?技术拆解、风险边界与合规借鉴方案
前端
捧 花13 小时前
FastAPI 基础语法:从一个完整接口理解 Web API 的设计
前端·python·fastapi·middleware
Hilaku14 小时前
一行 CSS 新特性干掉 20 行 JavaScript ?
前端·javascript·程序员
JarvanMo14 小时前
AI 写代码暴增 161 倍,移动开发有没有变得更差?
前端