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

相关推荐
黄油饼卷咖喱鸡就味增汤拌孜然羊肉炒饭9 小时前
SpringBoot如何实现缓存预热?
java·spring boot·spring·缓存·程序员
AskHarries11 小时前
Spring Cloud OpenFeign快速入门demo
spring boot·后端
isolusion12 小时前
Springboot的创建方式
java·spring boot·后端
Yvemil713 小时前
《开启微服务之旅:Spring Boot Web开发举例》(一)
前端·spring boot·微服务
星河梦瑾14 小时前
SpringBoot相关漏洞学习资料
java·经验分享·spring boot·安全
计算机学长felix15 小时前
基于SpringBoot的“交流互动系统”的设计与实现(源码+数据库+文档+PPT)
spring boot·毕业设计
.生产的驴15 小时前
SpringBoot 对接第三方登录 手机号登录 手机号验证 微信小程序登录 结合Redis SaToken
java·spring boot·redis·后端·缓存·微信小程序·maven
顽疲15 小时前
springboot vue 会员收银系统 含源码 开发流程
vue.js·spring boot·后端
撒呼呼16 小时前
# 起步专用 - 哔哩哔哩全模块超还原设计!(内含接口文档、数据库设计)
数据库·spring boot·spring·mvc·springboot
因我你好久不见16 小时前
springboot java ffmpeg 视频压缩、提取视频帧图片、获取视频分辨率
java·spring boot·ffmpeg