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方法。

相关推荐
HarvestHarvest1 分钟前
【Copy Web独立开发者实战:我是如何用 AI 实现网页 UI 1:1 完美复刻的?】
前端·人工智能·ui
RuoyiOffice2 分钟前
从 0 到 1 搭建 RuoyiOffice:30 分钟跑通后端+前端+移动端
前端·spring boot·uni-app·开源·oa·ruoyioffice·hrm
昭昭颂桉a4 分钟前
TypeScript 前端的必修课,从 JS 到 TS
开发语言·前端·javascript·typescript
用户938515635074 分钟前
从零实现一个 Todos 应用:原生 Ajax + Node 服务,顺便吃透 JSON.stringify
前端·javascript·后端
霸道流氓气质5 分钟前
Spring Boot 文件上传大小限制配置全解析
spring boot·后端·firefox
Java面试题总结5 分钟前
SpringBoot API参数校验
java·spring boot·后端
程序猿阿伟7 分钟前
《Chrome扩展:穿透沙箱与签名体系的技术本质》
前端·chrome
飘尘8 分钟前
豆包里一句话就能P图生视频,背后究竟发生了什么?
前端·人工智能·aigc
武子康11 分钟前
Java-24 深入浅出 Spring 全景:从起源到 Spring 6 一文打通 IoC / AOP / 发展史
java·后端·spring
asdfg125896316 分钟前
通俗理解软件开发中前后端开发的架构模式(后端逻辑分层的“三层架构”和前端逻辑分层的“MVC 模式”)
java·架构模式