springboot3拦截器

拦截器

控制器拦截器

  • Interceptor 作用
    1. 日志记录:记录请求信息的日志,以便进行信息监控、信息统计、计算 PV(Page View)等;
    2. 权限检查:如登录检测,进入处理器检测是否登录;
    3. 性能监控:通过拦截器在进入处理器之前记录开始时间,在处理完后记录结束时间,从而得到该请求的处理时间。(反向代理,如 Apache 也可以自动记录)
    4. 通用行为:读取 Cookie 得到用户信息并将用户对象放入请求,从而方便后续流程使用,还有如提取 Locale、Theme 信息等,只要是多个处理器都需要的即可使用拦截器实现。
  • 自定义 Interceptor
    1. 如果你需要自定义 Interceptor 的话必须实现 org.springframework.web.servlet.HandlerInterceptor接口

作者:hresh 链接:juejin.cn/post/684490... 来源:稀土掘金 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

控制器

java 复制代码
package wnan.explore.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
@RequestMapping("/it")
public class PenController {
    @RequestMapping("/02")
    @ResponseBody
    public String f02(){
        System.out.println("f02");
        return "f02";
    }
}

拦截器实体类,接口实现的方式

java 复制代码
package wnan.explore.interceptor;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
public class ExploreInterceptor implements HandlerInterceptor {
    @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");
    }
}

实现接口:org.springframework.web.servlet.HandlerInterceptor重写默认方法

  • preHandle()执行处理程序之前的拦截点。也就是进入控制器前执行前
    1. HttpServletRequest request:当前 HTTP 请求
    2. HttpServletRequest request:当前 HTTP 响应
    3. Object handler:表示选择执行的处理器(handler),通常是一个控制器类的实例。在这个方法中,可以根据handler的类型或实例进行逻辑判断。
  • postHandle()成功执行处理程序后的拦截点。就是控制器执行后,视图加载前
  • afterCompletion()请求处理完成后的回调,即渲染视图后 。将在处理程序执行的任何结果上调用,从而允许进行适当的资源清理。
    1. ex -- 处理程序执行时抛出的任何异常(如果有)

拦截器配置类

java 复制代码
package wnan.explore.config;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import wnan.explore.interceptor.ExploreInterceptor;

@Configuration
public class InterceptorConfig implements WebMvcConfigurer {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // InterceptorRegistry里有个InterceptorRegistration列表,把拦截器放入一个新的InterceptorRegistration里进行管理
        InterceptorRegistration var1 = registry.addInterceptor(new ExploreInterceptor());
         var1.addPathPatterns("/it/02"); // 可以识别 指定路径
    }
}

实现接口org.springframework.web.servlet.config.annotation.WebMvcConfigurer重写默认方法

  • addInterceptors添加 Spring MVC 生命周期拦截器,用于控制器方法调用和资源处理程序请求的预处理和后处理。可以注册拦截器以应用于所有请求,也可以限制为 URL 模式的子集

路径写法:

  1. var1.addPathPatterns("/it/02"); // 可以识别 指定路径

  2. var1.addPathPatterns("/**"); // 可以识别 通用识别 全部路径

  3. var1.addPathPatterns("/it/"); // 可以识别 通用识别 /it路径下的全部路径

  4. var1.addPathPatterns("/it/**"); // 可以识别 通用识别 /it路径下的全部路径

运行结果:

控制器全局异常拦截器

自定义异常

java 复制代码
package wnan.explore.exception;

public class Demo1Exception extends Exception{
    public Demo1Exception(String message) {
        super(message);
    }

    @Override
    public String getMessage() {
        return super.getMessage();
    }
}

自定义异常,继承实现,通常继承Exception或者Throwable类,重写某些方法,Throwable是实体类,居然不是接口,哈哈。

控制器:

java 复制代码
package wnan.explore.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import wnan.explore.exception.Demo1Exception;

@Controller
@RequestMapping("/it")
public class PenController {
    @GetMapping("/02")
    @ResponseBody
    public String f02(int code) throws Demo1Exception  {
        System.out.println("PenController 执行方法 f02");
        if (code==0) throw new Demo1Exception("参数错误");
        return "true111";
    }
}

全局异常拦截器

java 复制代码
package wnan.explore.exception;

import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

@RestControllerAdvice
public class GlobalMvcExceptionHandler {

    @ExceptionHandler(value = {Demo1Exception.class})
    public String handleException(Demo1Exception e){
        System.out.println(e.getMessage());
        System.out.println("handleException 0");
        return e.getMessage();
    }
}
  • @RestControllerAdvice适用于非视图模式,如果是视图,就是用@ControllerAdvice,这个注解可以指定要处理的具体控制器。可以是指定某个包下的所有类,也可以是具体的控制器类。

    java 复制代码
    @RestControllerAdvice(basePackageClasses = {YourController.class})
    java 复制代码
    @RestControllerAdvice(basePackages = "com.yourpackage.controller")
  • @ExceptionHandler用于定义全局或局部异常处理方法。当控制器抛出异常时,Spring会自动调用带有此注解的方法来处理异常。它可以标注在方法上,表示该方法负责处理特定类型的异常

运行结果:

源码--->>>springboot-explore

相关推荐
weixin_985432113 小时前
Spring Boot 中的 @ConditionalOnBean 注解详解
java·spring boot·后端
一只爱撸猫的程序猿5 小时前
创建一个基于Spring AI的智能旅行简单案例
spring boot·程序员·aigc
IT_10245 小时前
springboot从零入门之接口测试!
java·开发语言·spring boot·后端·spring·lua
陌殇殇7 小时前
Hadoop 002 — HDFS常用命令及SpringBoot整合操作
hadoop·spring boot·hdfs
迢迢星万里灬7 小时前
Java求职者面试指南:Spring、Spring Boot、Spring MVC与MyBatis技术点解析
java·spring boot·spring·mybatis·spring mvc·面试指南
weixin_446122467 小时前
浏览器播放监控画面
java·spring boot
西洼工作室9 小时前
Spring Boot常用依赖大全:从入门到精通
java·spring boot·后端
递归尽头是星辰9 小时前
SpringBoot深度解析:从核心原理到最佳实践
spring boot·事务传播机制·自动配置原理·springboot启动流程·starter设计
.生产的驴10 小时前
SpringBoot 服务器监控 监控系统开销 获取服务器系统的信息用户信息 运行信息 保持稳定
服务器·spring boot·分布式·后端·spring·spring cloud·信息可视化