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

相关推荐
计算机-秋大田2 小时前
基于微信小程序的电子竞技信息交流平台设计与实现(LW+源码+讲解)
spring boot·后端·微信小程序·小程序·课程设计
customer085 小时前
【开源免费】基于SpringBoot+Vue.JS景区民宿预约系统(JAVA毕业设计)
java·vue.js·spring boot·后端·开源
精通HelloWorld!10 小时前
使用HttpClient和HttpRequest发送HTTP请求
java·spring boot·网络协议·spring·http
拾忆,想起11 小时前
如何选择Spring AOP的动态代理?JDK与CGLIB的适用场景
spring boot·后端·spring·spring cloud·微服务
customer0813 小时前
【开源免费】基于SpringBoot+Vue.JS美食推荐商城(JAVA毕业设计)
java·vue.js·spring boot·后端·开源
一 乐14 小时前
基于微信小程序的酒店管理系统设计与实现(源码+数据库+文档)
java·数据库·vue.js·spring boot·微信小程序·酒店管理系统
小万编程19 小时前
【2025最新计算机毕业设计】基于SpringBoot+Vue家政呵护到家护理服务平台(高质量源码,可定制,提供文档,免费部署到本地)
java·vue.js·spring boot·计算机毕业设计·java毕业设计·web毕业设计
XYu123011 天前
Spring Boot 热部署实现指南
java·ide·spring boot·intellij-idea
是小崔啊1 天前
Spring Boot - 数据库集成07 - 数据库连接池
数据库·spring boot·oracle
细心的莽夫1 天前
SpringBoot 基础(Spring)
spring boot·后端·spring