第二十二节:学习拦截器使用方法(自学Spring boot 3.x的第六天)

这节记录springboot中如何使用拦截器。

第一步:创建拦截器

创建一个拦截器,实现HandlerInterceptor 接口,重写三个方法。

java 复制代码
package cn.wcyf.wcai.interceptor;

import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

@Component
public class TokenInterceptor implements HandlerInterceptor {
    Logger logger = LoggerFactory.getLogger(TokenInterceptor.class);

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        logger.info("preHandle执行中");
        return HandlerInterceptor.super.preHandle(request, response, handler);
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        logger.info("postHandle执行中");
        HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);
    }


    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        logger.info("afterCompletion执行中");
        HandlerInterceptor.super.afterCompletion(request, response, handler, ex);
    }
}

光新增还不够,还得在配置类中配置拦截器才可以。

第二步:注册拦截器

java 复制代码
package cn.wcyf.wcai.config;

import cn.wcyf.wcai.interceptor.TokenInterceptor;
import jakarta.annotation.Resource;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

import java.rmi.registry.Registry;

@Component
public class WebAppConfig implements WebMvcConfigurer {
    @Value("${upload.path}")
    private String uploadsPath;
    @Resource
    private TokenInterceptor tokenInterceptor;
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/img/**") //定义自定义资源的访问前缀
                .addResourceLocations("classpath:/images/")//定义自定义资源的存放路径
                .addResourceLocations("classpath:/122/");

        registry.addResourceHandler("/uploads/**")//定义自定义资源的访问前缀
                .addResourceLocations("file:"+uploadsPath);//定义自定义资源的存放路径
    }


    @Override
    public void addCorsMappings(CorsRegistry registry) {
       registry.addMapping("/**")
               .allowedOrigins("*")
               .allowedMethods("GET","POST","PUT","DELETE","CONNECT","OPTIONS","TRACE","PATCH")
               .allowedHeaders("*");
    }


    @Override
    public void addInterceptors(InterceptorRegistry registry) {
//        WebMvcConfigurer.super.addInterceptors(registry);
        registry.addInterceptor(tokenInterceptor);//默认拦截所有url
    }
}

如何放行部分url

java 复制代码
   @Override
    public void addInterceptors(InterceptorRegistry registry) {
//        WebMvcConfigurer.super.addInterceptors(registry);
        registry.addInterceptor(tokenInterceptor)//默认所有的url拦截
                .addPathPatterns("/**")//拦截所有要求
                .excludePathPatterns("/student/10");//排除某些url
    }

在WebAppConfig 中使用excludePathPatterns方法放行某些url即可。

WebMvcConfigurer的运行机制是什么样子的?

WebMvcConfigurer源码

java 复制代码
//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by FernFlower decompiler)
//

package org.springframework.web.servlet.config.annotation;

import java.util.List;
import org.springframework.format.FormatterRegistry;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.lang.Nullable;
import org.springframework.validation.MessageCodesResolver;
import org.springframework.validation.Validator;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.method.support.HandlerMethodReturnValueHandler;
import org.springframework.web.servlet.HandlerExceptionResolver;

public interface WebMvcConfigurer {
    default void configurePathMatch(PathMatchConfigurer configurer) {
    }

    default void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
    }

    default void configureAsyncSupport(AsyncSupportConfigurer configurer) {
    }

    default void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
    }

    default void addFormatters(FormatterRegistry registry) {
    }

    default void addInterceptors(InterceptorRegistry registry) {
    }

    default void addResourceHandlers(ResourceHandlerRegistry registry) {
    }

    default void addCorsMappings(CorsRegistry registry) {
    }

    default void addViewControllers(ViewControllerRegistry registry) {
    }

    default void configureViewResolvers(ViewResolverRegistry registry) {
    }

    default void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {
    }

    default void addReturnValueHandlers(List<HandlerMethodReturnValueHandler> handlers) {
    }

    default void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
    }

    default void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
    }

    default void configureHandlerExceptionResolvers(List<HandlerExceptionResolver> resolvers) {
    }

    default void extendHandlerExceptionResolvers(List<HandlerExceptionResolver> resolvers) {
    }

    @Nullable
    default Validator getValidator() {
        return null;
    }

    @Nullable
    default MessageCodesResolver getMessageCodesResolver() {
        return null;
    }
}

WebMvcConfigurer 是 Spring MVC 中的一个重要接口,它提供了一系列的方法用于自定义 Spring MVC 的配置。这个接口允许开发者在不直接修改 Spring MVC 的自动配置类的情况下,通过实现这个接口并重写其方法来自定义配置。下面是对这个接口中各个方法的简要说明:

复制代码
configurePathMatch(PathMatchConfigurer configurer): 用于配置路径匹配选项,如是否支持后缀模式匹配、是否去除 URL 中的尾随斜杠等。

configureContentNegotiation(ContentNegotiationConfigurer configurer): 用于配置内容协商策略,即根据请求的请求头(如 Accept)或请求参数来决定返回的内容类型。

configureAsyncSupport(AsyncSupportConfigurer configurer): 用于配置异步请求的支持,包括异步请求的超时时间、回调线程池等。

configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer): 用于配置对静态资源的处理,是否将静态资源的请求转发到默认的 Servlet 上处理。

addFormatters(FormatterRegistry registry): 用于添加自定义的格式化器(Formatter),用于在请求参数绑定和模型属性渲染时进行数据格式的转换。

addInterceptors(InterceptorRegistry registry): 用于添加自定义的拦截器(Interceptor),拦截器可以在请求处理前后执行一些操作,如日志记录、权限检查等。

addResourceHandlers(ResourceHandlerRegistry registry): 用于添加资源处理器,用于处理静态资源的请求,如图片、CSS、JavaScript 文件等。

addCorsMappings(CorsRegistry registry): 用于配置跨域资源共享(CORS)的映射,允许或拒绝来自不同源的请求。

addViewControllers(ViewControllerRegistry registry): 用于添加视图控制器,视图控制器允许将特定的 URL 路径映射到视图上,而不需要通过控制器方法处理。

configureViewResolvers(ViewResolverRegistry registry): 用于配置视图解析器,视图解析器用于将逻辑视图名解析为具体的视图对象。

addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers): 用于添加自定义的参数解析器,参数解析器用于将请求中的参数绑定到控制器方法的参数上。

addReturnValueHandlers(List<HandlerMethodReturnValueHandler> handlers): 用于添加自定义的返回值处理器,返回值处理器用于处理控制器方法的返回值,并将其转换为响应体或视图等。

configureMessageConverters(List<HttpMessageConverter<?>> converters): 用于配置 HTTP 消息转换器,消息转换器用于在请求和响应中读写数据,如将请求体中的 JSON 数据转换为 Java 对象,或将 Java 对象转换为 JSON 数据写入响应体。

extendMessageConverters(List<HttpMessageConverter<?>> converters): 类似于 configureMessageConverters,但用于在现有的消息转换器列表基础上添加或修改转换器。

configureHandlerExceptionResolvers(List<HandlerExceptionResolver> resolvers): 用于配置异常处理器,异常处理器用于处理控制器方法执行过程中抛出的异常,并返回相应的响应。

extendHandlerExceptionResolvers(List<HandlerExceptionResolver> resolvers): 类似于 configureHandlerExceptionResolvers,但用于在现有的异常处理器列表基础上添加或修改异常处理器。

getValidator(): 返回一个自定义的验证器(Validator),用于在数据绑定和验证过程中执行自定义的验证逻辑。

getMessageCodesResolver(): 返回一个自定义的消息码解析器(MessageCodesResolver),用于解析错误消息的代码。

通过实现 WebMvcConfigurer 接口并重写其方法,开发者可以灵活地定制 Spring MVC 的行为,以满足不同的业务需求。

相关推荐
蚂蚁背大象18 小时前
Rust 所有权系统是为了解决什么问题
后端·rust
子玖20 小时前
go实现通过ip解析城市
后端·go
Java不加班20 小时前
Java 后端定时任务实现方案与工程化指南
后端
心在飞扬20 小时前
RAG 进阶检索学习笔记
后端
Moment20 小时前
想要长期陪伴你的助理?先从部署一个 OpenClaw 开始 😍😍😍
前端·后端·github
Das1_20 小时前
【Golang 数据结构】Slice 底层机制
后端·go
得物技术20 小时前
深入剖析Spark UI界面:参数与界面详解|得物技术
大数据·后端·spark
古时的风筝20 小时前
花10 分钟时间,把终端改造成“生产力武器”:Ghostty + Yazi + Lazygit 配置全流程
前端·后端·程序员
Cache技术分享20 小时前
340. Java Stream API - 理解并行流的额外开销
前端·后端