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

相关推荐
码农派大星。11 分钟前
Spring Boot 配置文件
java·spring boot·后端
江深竹静,一苇以航20 分钟前
springboot3项目整合Mybatis-plus启动项目报错:Invalid bean definition with name ‘xxxMapper‘
java·spring boot
豪宇刘1 小时前
SpringBoot+Shiro权限管理
java·spring boot·spring
customer082 小时前
【开源免费】基于SpringBoot+Vue.JS医院管理系统(JAVA毕业设计)
java·vue.js·spring boot·后端·spring cloud·开源·intellij-idea
2402_857589362 小时前
SpringBoot框架:作业管理技术新解
java·spring boot·后端
杨荧2 小时前
【JAVA毕业设计】基于Vue和SpringBoot的服装商城系统学科竞赛管理系统
java·开发语言·vue.js·spring boot·spring cloud·java-ee·kafka
计算机-秋大田4 小时前
基于Spring Boot的船舶监造系统的设计与实现,LW+源码+讲解
java·论文阅读·spring boot·后端·vue
代码之光_19805 小时前
保障性住房管理:SpringBoot技术优势分析
java·spring boot·后端