SpringBoot配置拦截器

简介: SpringBoot配置拦截器

配置拦截器

1. 拦截器介绍

  • 拦截器是在servlet执行之前执行的程序(这里就是controller代码执行之前),它主要是用于拦截用户请求并作相应的处理,比如说可以判断用户是否登录,做相关的日志记录,也可以做权限管理。
  • SpringBoot中的拦截器实现和spring mvc 中是一样的,它的大致流程是,先自己定义一个拦截器类,并将这个类实现一个HandlerInterceptor类,或者是继承HandlerInterceptorAdapter,都可以实现拦截器的定义。然后将自己定义的拦截器注入到适配器中,也有两种方式,一种是实现WebMvcConfigurer接口,一种是继承WebMvcConfigurerAdapter。下面我们来看看如何完成。

2.自定义拦截器

/**
 * @Description: 自定义拦截器
 * @Author: Yang.Guo
 * @Date: 2021/08/09/14:44
 */
@Slf4j
public class Interceptor implements HandlerInterceptor {
    // 请求进来之前进行拦截
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        log.info("进入拦截器了");
        //中间写逻辑代码,比如判断是否登录成功,失败则返回false
        if(request.getHeader("token").equals("123")){
            return true;
        } else {
            return false;
        }
    }
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("controller 执行完了");
    }
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
        System.out.println("我获取到了一个返回的结果:"+response);
        System.out.println("请求结束了");
    }
}

代码说明:

  1. 1.自定义的拦截器可以实现HandlerInterceptor接口,也可以继承HandlerInterceptorAdapter类。
  2. 2.重写三个方法,当然也可以只实现一个最重要的preHandle方法。
  3. 3.preHandle方法:此方法会在进入controller之前执行,返回Boolean值决定是否执行后续操作。
  4. 4.postHandle方法:此方法将在controller执行之后执行,但是视图还没有解析,可向ModelAndView中添加数据(前后端不分离的)。
  5. 5.afterCompletion方法:该方法会在整个请求结束(请求结束,但是并未返回结果给客户端)之后执行, 可获取响应数据及异常信息。

3.拦截器注入适配器

/**
 * @Description:
 * @Author: Yang.Guo
 * @Date: 2021/08/09/14:50
 */
@Configuration
public class MyInterceptorConfig implements WebMvcConfigurer {
    // 重写添加拦截器的方法
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new Interceptor()) //将我们新建的过滤器添加进装配器中
                .addPathPatterns("/**") // 过滤掉所有的请求。
                .excludePathPatterns("/loginController/login"); // 除了那些请求。
    }
}

代码说明:

  1. 1.通过实现WebMvcConfigurer接口可以自定义一个适配器,也可以通过继承WebMvcConfigurerAdapter来定义适配器,建议使用第一种,第二种已经是过时的方法了。
  2. 2.重写addInterceptors方法,addInterceptor方法是将拦截器注入到适配器中。
  3. 3.addPathPatterns方法是设置一个需要拦截的路径,可以是多个字符串或者是直接传入一个数组。
  4. 4.excludePathPatterns是配置不需要拦截的路径。
  5. 5.需要加上configuration注解说明这是一个配置类,在项目启动的时候自动执行。

4.controller测试

/**
 * @Description:
 * @Author: Yang.Guo
 * @Date: 2021/08/09/15:00
 */
@RestController
public class LoginController {
    @PostMapping("/loginController/login")
    public String loginController(){
        return "不会被拦截的登录请求";
    }
    @PostMapping("/hello")
    public String helloController(){
        return "会被拦截的Hello请求";
    }
}

5. 测试

测试未拦截的接口,浏览器输入:localhost:8097/LoginController/login,查看控制台输出情况。

image.png

  1. 1.控制台只输出了未拦截接口内的代码,说明这个接口是未拦截的。浏览器的显示就不管了。其实一般是拦截登录接口,这里就将它放开了,以供测试。

测试拦截的接口,浏览器输入:localhost:8097/hello/hello,查看控制台输出情况。

image (1).png

  • 1.可以看到,首先是进入了拦截器,通过拦截器之后,进入了controller中的方法,执行完controller的代码之后就进入了自定义拦截器中的postHandle方法,最后进入afterCompletion方法,并获取到了一个response对象。

6. 扩展内容:拦截器链

我们可以定义多个拦截器组成一个拦截器链。我们可以在适配器中注入多个拦截器。多加一行代码就行了。

按照拦截器注入的顺序,拦截器的执行顺序应该是一下顺序:拦截器1,拦截器2,拦截器2处理,拦截器1处理,拦截器2结束,拦截器1结束。对应三个过程的方法就是preHandle,postHandle,afterCompletion

7. 总结

 本文从拦截器的自定义到自定义适配器,然后将拦截器注入适配器,再到编写测试代码。准备工作完成之后就进行一个测试拦截器是否成功,最后扩展出拦截器链的一些内容。

 

参考:https://www.cnblogs.com/swzx-1213/p/12788576.html#1-%E6%8B%A6%E6%88%AA%E5%99%A8%E4%BB%8B%E7%BB%8D

相关文章
|
2月前
|
SQL 监控 druid
springboot-druid数据源的配置方式及配置后台监控-自定义和导入stater(推荐-简单方便使用)两种方式配置druid数据源
这篇文章介绍了如何在Spring Boot项目中配置和监控Druid数据源,包括自定义配置和使用Spring Boot Starter两种方法。
|
6天前
|
Java 开发者 微服务
手写模拟Spring Boot自动配置功能
【11月更文挑战第19天】随着微服务架构的兴起,Spring Boot作为一种快速开发框架,因其简化了Spring应用的初始搭建和开发过程,受到了广大开发者的青睐。自动配置作为Spring Boot的核心特性之一,大大减少了手动配置的工作量,提高了开发效率。
22 0
|
1月前
|
Java API 数据库
构建RESTful API已经成为现代Web开发的标准做法之一。Spring Boot框架因其简洁的配置、快速的启动特性及丰富的功能集而备受开发者青睐。
【10月更文挑战第11天】本文介绍如何使用Spring Boot构建在线图书管理系统的RESTful API。通过创建Spring Boot项目,定义`Book`实体类、`BookRepository`接口和`BookService`服务类,最后实现`BookController`控制器来处理HTTP请求,展示了从基础环境搭建到API测试的完整过程。
42 4
|
1月前
|
Java 数据库连接 Maven
springBoot:项目建立&配置修改&yaml的使用&resource 文件夹(二)
本文档介绍了如何创建一个基于Maven的项目,并配置阿里云仓库、数据库连接、端口号、自定义启动横幅及多环境配置等。同时,详细说明了如何使用YAML格式进行配置,以及如何处理静态资源和模板文件。文档还涵盖了Spring Boot项目的`application.properties`和`application.yaml`文件的配置方法,包括设置数据库驱动、URL、用户名、密码等关键信息,以及如何通过配置文件管理不同环境下的应用设置。
|
30天前
|
Java API 数据库
Spring Boot框架因其简洁的配置、快速的启动特性及丰富的功能集而备受开发者青睐
本文通过在线图书管理系统案例,详细介绍如何使用Spring Boot构建RESTful API。从项目基础环境搭建、实体类与数据访问层定义,到业务逻辑实现和控制器编写,逐步展示了Spring Boot的简洁配置和强大功能。最后,通过Postman测试API,并介绍了如何添加安全性和异常处理,确保API的稳定性和安全性。
36 0
|
10天前
|
缓存 IDE Java
SpringBoot入门(7)- 配置热部署devtools工具
SpringBoot入门(7)- 配置热部署devtools工具
22 2
 SpringBoot入门(7)- 配置热部署devtools工具
|
8天前
|
Java 数据库连接
SpringBoot配置多数据源实战
第四届光学与机器视觉国际学术会议(ICOMV 2025) 2025 4th International Conference on Optics and Machine Vision
36 8
|
6天前
|
Java 数据库连接 数据库
springboot启动配置文件-bootstrap.yml常用基本配置
以上是一些常用的基本配置项,在实际应用中可能会根据需求有所变化。通过合理配置 `bootstrap.yml`文件,可以确保应用程序在启动阶段加载正确的配置,并顺利启动运行。
12 2
|
17天前
|
Java Spring 容器
SpringBoot读取配置文件的6种方式,包括:通过Environment、@PropertySource、@ConfigurationProperties、@Value读取配置信息
SpringBoot读取配置文件的6种方式,包括:通过Environment、@PropertySource、@ConfigurationProperties、@Value读取配置信息
43 3
|
29天前
|
druid Java Maven