当前位置:   article > 正文

Spring Boot 拦截器

Spring Boot 拦截器

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

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

1. 定义拦截器

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

  1. @Slf4j
  2. @Component
  3. public class LoginInterceptor implements HandlerInterceptor {
  4. @Override
  5. public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
  6. //true代表通过,false代表拦截
  7. //log.info("目标方法执行前执行");
  8. return true;
  9. }
  10. @Override
  11. public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
  12. //log.info("目标方法执行后执行");
  13. }
  14. }

2. 注册拦截器

实现WebMvcConfigurer接口,重新addInterceptors方法

  1. @Configuration
  2. public class WebConfig implements WebMvcConfigurer {
  3. //自定义拦截对象
  4. @Autowired
  5. LoginInterceptor loginInterceptor;
  6. @Override
  7. public void addInterceptors(InterceptorRegistry registry) {
  8. //注册自定义拦截对象
  9. registry.addInterceptor(loginInterceptor)
  10. //设置拦截器生效路径,代表url中的路径,/**代表所有路径
  11. .addPathPatterns("/**")
  12. //排除路径
  13. .excludePathPatterns("/user/login")
  14. // .excludePathPatterns("/static/**"); //不能直接使用static/**
  15. //需要把静态文件排除
  16. .excludePathPatterns("/css/**")
  17. .excludePathPatterns("/js/**")
  18. .excludePathPatterns("/pic/**")
  19. .excludePathPatterns("/**/*.html");
  20. }
  21. }

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/441823?site
推荐阅读
相关标签
  

闽ICP备14008679号