拦截器Interceptor

server/2024/9/24 10:41:01/

1.创建一个拦截器,继承HandlerInterceptor

public class AuthorizedInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {return HandlerInterceptor.super.preHandle(request, response, handler);}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {HandlerInterceptor.super.afterCompletion(request, response, handler, ex);}
}

可以实现这三个接口(通常只用到第一个)

preHandle(重点)

这个方法在请求处理之前调用(Controller方法调用之前)。它返回一个布尔值,true表示继续流程(调用下一个拦截器或走完所有要走的拦截器去执行控制器的方法);false表示流程中断,不会继续调用其他的拦截器(如果有的话),也不会调用目标Controller方法。

postHandle

这个方法在请求处理之后、视图渲染之前调用(Controller方法调用之后)。它主要用于对请求处理之后的模型和视图进行后处理(如果有的话)。如果控制器没有返回任何视图或模型,该方法也可以被调用。

afterCompletion

这个方法在整个请求结束之后被调用,也就是在DispatcherServlet渲染了对应的视图执行完毕之后执行。这个方法主要用于进行资源清理工作。

2.写拦截器的逻辑,交给spring管理

@Component
public class AuthorizedInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {log.info("拦截器执行了...");//执行校验token的逻辑,校验成功放行,// 校验失败则 throw new BusinessException(ResponseEnum.TOKEN_INVALID);return true;}
}

3.写一个WebMvcConfig,注册拦截器

package com.gmgx.config;import com.gmgx.interceptors.AuthorizedInterceptor;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;import java.util.List;@Slf4j
@Configuration
public class WebMvcConfig extends WebMvcConfigurationSupport {//白名单/**:匹配当前路径中的任意单个部分。例如,/webjars/* 会匹配 /webjars/ 下的任意一个具体路径,比如 /webjars/jquery,但不会匹配 /webjars/jquery/1.0。**:匹配任意多个路径部分,包括零个或多个子目录。例如,/webjars/** 可以匹配 /webjars/ 下的任意路径,比如 /webjars/jquery/1.0、/webjars/jquery,甚至 /webjars/ 本身。*/private final List<String> whitelist = List.of("/*/login", "/doc.html", "/webjars/**", "/v3/api-docs/**", "/adminApi/validateToken/**");@Resourceprivate AuthorizedInterceptor authorizedInterceptor;@Overrideprotected void addInterceptors(InterceptorRegistry registry) {//注意这里不适合用创建对象的方式注册拦截器,因为会打破Spring IOC和DI 的特性//registry.addInterceptor(new AuthorizedInterceptor());registry.addInterceptor(authorizedInterceptor)//注册拦截器.addPathPatterns("/**")//注册该拦截器拦截的路径.excludePathPatterns(whitelist);//排除路径,即不需要被拦截的路径//        registry.addInterceptor(otherInterceptors.....)添加更多拦截器}@Overrideprotected void addResourceHandlers(ResourceHandlerRegistry registry) {log.info("开始设置静态资源映射...");registry.addResourceHandler("/doc.html").addResourceLocations("classpath:/META-INF/resources/");registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/");}
}

WebMvcConfig继承WebMvcConfigurationSupport,在里面通过addInterceptors方法注册拦截器。

最后要加上@Configuration 注解,交给Spring管理。


循环引用

控制台出现如下信息

# 允许循环引用
spring.main.allow-circular-references=true

或者加上@Lazy注解打断循环引用(最优解)


http://www.ppmy.cn/server/121313.html

相关文章

linux文件目录指令合集--拷贝、移动、查看

目录 1.文件和文件夹的拷贝 1.1文件的树状结构 1.2文件的拷贝 1.3文件夹的拷贝 1.4强制覆盖 2.文件和文件夹的移动 2.1重命名 2.2移动 2.3移动并重命名 2.4移动整个目录 3.文件内容的查看 3.1显示行号 3.2借助管道 3.3单独使用more 3.4less指令 3.5其他的指令 …

Array.prototype.slice.call()

Array.prototype.slice.call arguments 举例子 Array.prototype.slice.call(arguments); 这行代码在JavaScript中经常被用来将类数组对象&#xff08;如函数的arguments对象&#xff09;转换成一个真正的数组。这里解释一下为什么需要这样做以及这行代码是如何工作的。 为什…

【C++掌中宝】玩转C++标准输入输出(简洁明了)

文章目录 前言1. I/O库头文件2. C的标准输入输出——\<iostream\>3. 基本用法3.1 标准输出流&#xff08;cout&#xff09;3.2 标准输入流&#xff08;cin&#xff09;3.3 标准错误流&#xff08;cerr&#xff09;3.4 标准日志流&#xff08;clog&#xff09; 4. 内容补充…

高刷显示器哪个好?540Hz才有资格称高刷

高刷显示器哪个好&#xff1f;说实话&#xff0c;540Hz这些才能成为高刷显示器&#xff0c;什么200,240的&#xff0c;都不够高&#xff0c;什么是从容&#xff0c;有我不用才叫从容。下面我们一起来看看540Hz的高刷显示器都有哪些吧&#xff01; 1.高刷显示器哪个好 - 蚂蚁电…

AWS EKS 中的负载均衡和 TLS 配置:全面指南

在现代云原生应用程序架构中,负载均衡器扮演着至关重要的角色。对于运行在 Amazon Elastic Kubernetes Service (EKS) 上的应用程序来说,理解和正确配置负载均衡是确保应用程序高可用性、可扩展性和安全性的关键。本文将全面介绍 AWS EKS 中的负载均衡配置,包括 Application…

Windows系统的Tomcat日志路径配置

文章目录 引言I Windows系统的Tomcat日志路径配置配置常规日志路径访问日志路径配置,修改server.xmlII 日志文件切割:以分隔割tomcat 的 catalina.out 文件为例子通过Linux系统自带的切割工具logrotate来进行切割引言 需求:C盘空间不足,处理日志文件,tomcat日志迁移到D盘…

实时美颜的技术突破:视频美颜SDK与直播美颜工具的开发详解

如今&#xff0c;视频美颜SDK和直播美颜工具的开发&#xff0c;为各类应用提供了技术支持&#xff0c;使得美颜效果更加智能、高效。本文将详细探讨实时美颜的技术突破及其在视频美颜SDK和直播美颜工具中的应用与开发。 一、视频美颜SDK的核心技术 1.人脸检测与特征点识别 视…

springboot提升-kafka组件接入与使用

文章目录 一、依赖添加二、配置属性三、创建 Kafka 请求对象生产者配置发送消息接收消息四、测试下面是如何在 Spring Boot 应用中集成 Kafka 的基本步骤: 一、依赖添加 首先,你需要在你的项目中添加 spring-kafka 的依赖。如果你使用的是 Maven,可以在 pom.xml 文件中添加…