欢迎光临
我们一直在努力

统一功能处理(1)拦截器

统一功能处理(1)拦截器

文章目录

  • 统一功能处理(1)拦截器
    • 观前提醒:
  • 1. 什么是拦截器
    • 举例理解:
      • 第一个例子:学校门口,保安,人脸识别
      • 第二个例子:银行办理业务
    • 实际的拦截器:
  • 2. 拦截器的基本使用
    • 定义拦截器:
    • 注册配置拦截器:
    • 测试:
      • preHandle()方法的返回值是:true(放行)
      • preHandle()方法的返回值是:false(拦截)
    • 排除拦截请求:
  • 3. 拦截器执行流程
  • 4. 总结:

观前提醒:

如果你是第一次点击这篇博客的,需要你将我 图书管理系统 的博客列表中,从这篇开始看: 图书管理系统(1)项目准备,用户登录接口,添加图书接口 直到看到 图书管理系统(6)强制登陆前端 这篇博客。

当然,如果你只是想单纯了解 拦截器 的使用,这篇博客,也是完全可以的。 就算你不看上面的博客,也是可以的。 引入上面的博客链接,只是为了更好的展开学习 拦截器 的目的。

在图书管理系统中,我们完成了强制登录的功能,后端程序根据Session来判断用户是否登录,但是实现方法是比较麻烦的

  • 需要修改每个接口的处理逻辑
  • 需要修改每个接口的返回结果
  • 接口定义修改,前端代码也需要跟着修改

有没有更简单的办法,统⼀拦截所有的请求,并进行Session校验呢?

这⾥我们学习⼀种新的解决办法: 拦截器

1. 什么是拦截器

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

举例理解:

第一个例子:学校门口,保安,人脸识别

现在的大学,门口都是一个用来人脸识别的门,验证学生的身份是否是本校学生。 门口还有 保安,如果是外校学生进来本学校,就会先审问这个外校学生的信息,提供身份信息,保安判断无误,外校学生填写登记表格,才能进入这个学校。

学生回学校上课,学生回学校住宿,进入学校的前提是:通过人脸识别的认证,确定是本校学生。 该校学生带朋友(外校学生),进学校参观,进入学校的前提是:保安确认身份信息,登录来访记录,外校学生才能进入学校。

那么,进入学校之前的操作:保安的检验,人脸识别的检验,就可以认为起到了 拦截器 的作用。 如果要进校园(指定方法),就需要通过 保安的检验或人脸识别的检验(需要执行预先设定的代码),这就是拦截器的作用。

第二个例子:银行办理业务

比如我们去银行办理业务,在办理业务前后,就可以加⼀些拦截操作 办理业务之前,先取号,如果带⾝份证了就取号成功

业务办理结束,给业务办理人员的服务进行评价。 这些就是"拦截器"做的⼯作。

实际的拦截器:

拦截器,允许开发人员提前预定义⼀些逻辑,在用户的请求响应前后执行, 也可以在用户请求前阻⽌其执行。

在拦截器当中,开发人员可以在应用程序中做⼀些通用性的操作,比如通过拦截器来拦截前端发来的请求,判断Session中是否有登录用户的信息:

如果有就可以放行。 如果没有就进行拦截。 在这里插入图片描述

2. 拦截器的基本使用

拦截器的使用步骤分为两步:

  • 定义拦截器
  • 注册配置拦截器
  • 拦截器的代码,写在 图书管理系统(6)强制登陆前端 上,因为要和接口进行一起测试,才能看到效果

    定义拦截器:

    创建一个 intercepter包,里面定义 LoginIntercepter类。

    实现 HandlerInterceptor接口,并重写其所有方法

    代码:

    import jakarta.servlet.http.HttpServletRequest;
    import jakarta.servlet.http.HttpServletResponse;
    import lombok.extern.slf4j.Slf4j;
    import org.springframework.stereotype.Component;
    import org.springframework.web.servlet.HandlerInterceptor;
    import org.springframework.web.servlet.ModelAndView;

    @Slf4j
    @Component
    public class LoginIntercepter implements HandlerInterceptor {

    /**
    *
    * @param request
    * @param response
    * @param handler
    * @return
    * true:对目标方法放行,不会拦截
    * false:拦截目标方法,通过验证之后,才能访问
    * @throws Exception
    */

    @Override
    public boolean preHandle(HttpServletRequest request,HttpServletResponse response,Object handler) throws Exception {
    log.info("preHandle方法,目标方法执行前。。。");

    // true: 放行目标方法
    // false:拦截目标方法
    return true;
    }

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

    @Override
    public void afterCompletion(HttpServletRequest request,HttpServletResponse response,Object handler,Exception ex) throws Exception {
    log.info("LoginInterceptor 视图渲染完毕后执行,最后执行");
    HandlerInterceptor.super.afterCompletion(request,response,handler,ex);
    }
    }

    HandlerInterceptor 接口包含三个方法:

    • preHandle():在目标方法执行前调用。
      • 返回 true:放行,允许访问目标方法
      • 返回 false:拦截,阻止访问目标方法
    • postHandle():在目标方法执行后、视图渲染前调用
    • afterCompletion():在视图渲染完毕后执行,是整个请求处理流程的最后一步(后端开发目前一般不涉及视图,可暂不深入)

    注册配置拦截器:

    创建一个 config包,定义一个 WebConfig类。

    实现WebMvcConfigurer接口,并重写addInterceptors方法。

    代码:

    import lombok.extern.slf4j.Slf4j;
    import org.example.book_system_20251107.book.intercepter.LoginIntercepter;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
    import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

    @Slf4j
    @Configuration
    public class WebConfig implements WebMvcConfigurer {

    @Autowired
    private LoginIntercepter loginIntercepter;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
    log.info("拦截器启动拦截");
    registry.addInterceptor(loginIntercepter).addPathPatterns("/**");
    // 这句代码做了两件事情:
    // 1. 添加拦截器对象,指定使用的拦截器
    // 2. 设置拦截器拦截的请求路径( /** 表⽰拦截所 有请求)
    }
    }

    一定要注意的点:WebConfig类,需要添加 @Configuration注解,WebConfig类中的 addInterceptors方法,才会执行。

    换句话说:WebConfig类,需要添加 @Configuration注解,拦截器才会启动

    在这里插入图片描述

    关于拦截路径:这是⼀些常见拦截路径设置:

    在这里插入图片描述

    /**:表示所有的请求路径,都会被拦截。

    /book/** :表示请求路径中,包含 book 这个字符的所有请求,都会被拦截

    测试:

    启动图书管理系统,使用 Postman进行测试:

    访问登录的接口,url= http://127.0.0.1:8080/user/login name=admin&password=admin

    这是图书管理系统中,用户登录接口的路径。

    preHandle()方法的返回值是:true(放行)

    在这里插入图片描述

    在这里插入图片描述

    preHandle()方法的返回值是:false(拦截)

    在这里插入图片描述

    在这里插入图片描述

    可以看到,这次的请求,被拦截器拦截了,没有执行之后的任何操作。

    没有进行登录的验证,就是被拦截了,这次的请求,没有放行。

    所以,在拦截器中,需要设置一些业务逻辑,判断请求拦截的条件。

    什么情况下,应该拦截。

    排除拦截请求:

    拦截器,还可以排除相关路径的请求。

    这个功能,在 图书管理系统(7)完善强制登录功能 中使用,并进行了演示。

    3. 拦截器执行流程

    正常的调用顺序: 在这里插入图片描述

    有了拦截器之后,会在调用 Controller 之前进行相应的业务处理,执行的流程如下图: 在这里插入图片描述

  • 添加拦截器后,执行Controller的方法之前,请求会先被拦截器拦截住。 执行 preHandle() 方法, 这个方法需要返回⼀个布尔类型的值:

    ​如果返回true,就表示放行本次操作,继续访问controller中的方法

    如果返回false,则不会放行(controller中的方法也不会执行)

  • controller当中的方法执行完毕后,再回过来执行 postHandle() 这个方法以及afterCompletion() 方法,执行完毕之后,最终给浏览器响应数据.

    请求和响应,在有拦截器(interceptor),过滤器(filter)的时候,执行的先后顺序是这样的:

  • 在这里插入图片描述

    4. 总结:

    这篇博客,主要讲了拦截器相关知识,主要有:

  • 什么是拦截器
  • 拦截器的基本使用
  • 拦截器执行流程
  • 最后,如果这篇博客能帮到你的,请你点点赞,有写错了,写的不好的,欢迎评论指出,谢谢! 下一篇博客:统一功能处理(2)统一数据返回格式

    赞(0)
    未经允许不得转载:171主机测评 » 统一功能处理(1)拦截器
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址