首页 > 其他分享 >SpringBoot拦截器Interceptor讲解

SpringBoot拦截器Interceptor讲解

时间:2024-06-12 23:01:10浏览次数:21  
标签:拦截器 SpringBoot demo 放行 Interceptor 执行 方法 拦截

1.拦截器介绍

1.1拦截器是什么

  • 拦截器是一种动态拦截方法调用的机制,相当于过滤器;
  • 拦截器是Spring框架中提供的,用来动态拦截控制器方法的执行。

1.2拦截器作用

  • 拦截请求,在指定方法调用前后,根据业务需求编写处理逻辑。

在拦截器当中,通常做一些通用性的操作,比如:我们可以通过拦截器来拦截前端发起的请求,将登录校验的逻辑全部编写在拦截器当中。在校验的过程当中,如发现用户登录了(携带JWT令牌或者Token且检验合法),就可以直接放行,去访问spring当中我们编写的方法。如果校验时发现并没有登录或是非法令牌,就可以直接给前端响应未登录的错误信息。

2.拦截器使用

以下是拦截器的具体使用过程:

2.1定义拦截器

自定义拦截器:实现HandlerInterceptor接口,并重写其所有方法

@Component
public class CommonInterceptor implements HandlerInterceptor {

    //目标资源方法执行前执行。 返回true:放行    返回false:不放行
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
           System.out.println("preHandle方法执行.... ");
            // 在此处编写我们的拦截逻辑
            return true;  
    }

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

     //视图渲染完毕后执行,最后执行
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("afterCompletion方法执行.... ");
    }
}

 注意:preHandle方法:目标资源方法执行前执行。 返回true:放行 返回false:不放行

           postHandle方法:目标资源方法执行后执行

           afterCompletion方法:视图渲染完毕后执行,最后执行

 2.2注册配置拦截器

 注册配置拦截器:实现WebMvcConfigurer接口,并重写addInterceptors方法

@Configuration
public class WebMvcConfiguration  extends WebMvcConfigurationSupport {

    //注入自定义的拦截器对象
    @Autowired
    private CommonInterceptor commonInterceptor;

    @Override
    protected void addInterceptors(InterceptorRegistry registry) {
        System.out.println("开始注册自定义拦截器...");
        registry.addInterceptor(commonInterceptor) //添加拦截器
                .addPathPatterns("/**") //设置拦截器拦截的请求路径( /** 表示拦截所有请求)
                .excludePathPatterns("/login") //不需要拦截的路径
        ;
    }
}

 在拦截器中除了可以设置/**拦截所有资源外,还有一些常见拦截路径设置:

拦截路径

含义

举例

/*

一级路径

能匹配/demo,/login,不能匹配 /demo/1

/**

任意路径

能匹配/demo,/demo/1,/demo/1/2

/demo/*

/demo下的一级路径

能匹配/demo/1,不能匹配/demo/1/2,/demo

/demo/**

/demo下的任意级路径

能匹配/demo,/demo/1,/demo/1/2,不能匹配/emps/1

 3.拦截器执行流程

 

 

  • 当我们打开浏览器来访问web应用时,此时过滤器会拦截到这次请求。拦截到这次请求之后,它会先执行放行前的逻辑,然后再执行放行操作。如果是基于springboot开发的,那么放行之后是进入到spring的环境当中,也就是访问我们所定义的controller当中的接口方法。

  • Tomcat并不识别所编写的Controller程序,但是它识别Servlet程序,所以在Spring的Web环境中提供了一个非常核心的Servlet:DispatcherServlet(前端控制器),所有请求都会先进行到DispatcherServlet,再将请求转给Controller。

  • 当我们定义了拦截器后,会在执行Controller的方法之前,请求被拦截器拦截住。执行preHandle()方法,如果返回true,就表示放行本次操作,才会继续访问controller中的方法;如果返回false,则不会放行(controller中的方法也不会执行)。

  • 在controller当中的方法执行完毕之后,再回过来执行postHandle()这个方法以及afterCompletion() 方法,然后再返回给DispatcherServlet,最终再来执行过滤器当中放行后的这一部分逻辑的逻辑。执行完毕之后,最终给浏览器响应数据。

标签:拦截器,SpringBoot,demo,放行,Interceptor,执行,方法,拦截
From: https://blog.csdn.net/qq_62602995/article/details/139637767

相关文章

  • springboot2.6x集成swagger2踩坑点
    最近在用springBoot2.6.13集成swagger2.9.2时出现了几个bug,经过几番尝试后,得出了最终的结论,时间紧可以直接看结论。首次集成swagger2时,启动springboot后的bug:org.springframework.context.ApplicationContextException:Failedtostartbean'documentationPluginsBoots......
  • springboot rabbitmq如何保证消息顺序消费
    很多时候,消息的消费是不用保证顺序的,比如借助mq实现订单超时的处理。但有些时候,业务中可能会存在多个消息需要顺序处理的情况,比如生成订单和扣减库存消息,那肯定是先执行生成订单的操作,再执行扣减库存的操作。那么这种情况下,是如何保证消息顺序消费的呢?首先,为了效率,我们可以设置......
  • DockerCompose+Jenkins+Pipeline流水线打包SpringBoot项目(解压安装配置JDK、Maven等)
    场景DockerCompose中部署Jenkins(DockerDesktop在windows上数据卷映射):https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/139491855Docker+Jenkins+Gitee+Maven项目配置jdk、maven、gitee等拉取代码并自动构建以及遇到的那些坑:https://blog.csdn.net/BADAO_LIUMANG_......
  • springboot集成socketio
    1.引入依赖<dependency><groupId>com.corundumstudio.socketio</groupId><artifactId>netty-socketio</artifactId><version>2.0.3</version></dependency>2.基本配置server:port:8081socketio:host:localho......
  • springboot3项目的搭建四.3(security登录认证配置)
    security的jwt验证:总体来说,我们加入依赖项,security就已经开始生效了,但是使用的默认的UserDetails和UserDetailsService,一、我们只要继承UserDetailsService,在数据库中查询用户和权限列表,封装成UserDetails的实现类,返回就可以实现,security验证的接管,最多在security配置类中,放行......
  • SpringBoot 多文件打包下载
    第一种@RestController@RequestMapping("/download")publicclassDownloadController{@GetMapping("/files")publicResponseEntity<InputStreamResource>downloadFiles()throwsIOException{//......
  • 网易面试:SpringBoot如何开启虚拟线程?
    虚拟线程(VirtualThread)也称协程或纤程,是一种轻量级的线程实现,与传统的线程以及操作系统级别的线程(也称为平台线程)相比,它的创建开销更小、资源利用率更高,是Java并发编程领域的一项重要创新。PS:虚拟线程正式发布于Java长期支持版(LongTermSuort,LTS)Java21(也就是JDK21)。......
  • SpringBoot面试准备 第一天
    什么是SpringBoot?简化Spring 应用程序开发的框架,通过自动配置、起步依赖和简化的配置方式,使开发人员能够更快速、方便地创建和配置Spring应用程序,提高开发效率和开发体验目标是使开发人员能够更加快速、方便地创建和配置Spring应用程序,同时尽可能地减少样板代码和繁琐......
  • 【接口自动化测试框架练习】springboot+react+mysql~极简版postman
    可以说是一个toyprogram,chatgpt完成了一部分工作,我也完成了一部分工作,我俩合作的,我占百分之80%,他百分之20%,哈哈没他不行,源码奉上。https://github.com/Jinwenxin/test-api-frontend1.功能简介:分成三部分,如左侧导航栏所示:测试用例管理:测试用例的增删改查以及运行测试套件管理......
  • 【S087】Springboot+Thymleaf在线答疑系统项目源码 java源代码
    运行截图:登录学生注册教师注册学生发起问题联系我们后台首页常见问题管理添加常见问题人工答疑学生管理个人信息修改密码项目组成:项目源码:源码获取⬇⬇⬇......