如何解决 Spring Boot 拦截器不生效的问题

SpringBoot 自定义拦截器 HandlerInterceptor 方法没有生效 SpringBoot 自定义拦截器 HandlerInterceptor 方法没有生效,解决办法:需要在AbsWebMvcConfigurerAdapter 重新 :addInterceptors 方法 添加上自定义的拦截器 阅读详情
AI摘要

本文探讨了SpringBoot中拦截器不生效的常见原因及解决办法,重点在于配置类的包扫描路径,提供了调整包路径和指定扫描范围两种解决方案。

在使用 Spring Boot 开发 Web 应用时,我们常常需要使用拦截器(Interceptor)来对请求进行预处理。例如,验证用户是否登录。然而,很多开发者会遇到一个常见的问题:拦截器配置了却不生效。本文将讨论一种常见的原因及其解决方案——将配置类移入正确的包下。

问题描述

我们创建了一个 LoginCheckInterceptor 类,并在 WebConfig 类中进行注册。但是,启动应用后发现拦截器并没有生效。

示例代码:

LoginCheckInterceptor 类:

package com.itheima.interceptor;

import com.alibaba.fastjson.JSONObject;
import com.itheima.pojo.Result;
import com.itheima.utils.JwtUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@Slf4j
@Component
public class LoginCheckInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest req, HttpServletResponse resp, Object handler) throws Exception {
        String url = req.getRequestURL().toString();
        log.info("请求的url: {}", url);

        if (url.contains("login")) {
            log.info("登录操作, 放行...");
            return true;
        }

        String jwt = req.getHeader("token");

        if (!StringUtils.hasLength(jwt)) {
            log.info("请求头token为空,返回未登录的信息");
            Result error = Result.error("NOT_LOGIN");
            String notLogin = JSONObject.toJSONString(error);
            resp.getWriter().write(notLogin);
            return false;
        }

        try {
            JwtUtils.parseJWT(jwt);
        } catch (Exception e) {
            e.printStackTrace();
            log.info("解析令牌失败, 返回未登录错误信息");
            Result error = Result.error("NOT_LOGIN");
            String notLogin = JSONObject.toJSONString(error);
            resp.getWriter().write(notLogin);
            return false;
        }

        log.info("令牌合法, 放行");
        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...");
    }
}

WebConfig 类:

package com.config;

import com.itheima.interceptor.LoginCheckInterceptor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Autowired
    private LoginCheckInterceptor loginCheckInterceptor;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(loginCheckInterceptor).addPathPatterns("/**");
    }
}

解决方案

将 WebConfig 类移到 itheima 包下即可解决问题。原因在于 Spring Boot 的默认包扫描机制。

原因分析

Spring Boot 使用 @SpringBootApplication 注解的主应用类启动应用。该注解包含了 @ComponentScan,默认扫描主应用类所在包及其子包中的所有组件。如果 WebConfig 类不在主应用类所在包或其子包下,Spring Boot 将无法自动扫描到它,从而导致拦截器不生效。

解决方法

将 WebConfig 类移到 com.itheima 包下,确保其在主应用类的扫描路径内。

调整后的目录结构:

src/main/java
 └── com
     └── itheima
         ├── MyApplication.java
         ├── interceptor
         │   └── LoginCheckInterceptor.java
         └── config
             └── WebConfig.java
代码调整

将 WebConfig 类从 com.config 包移到 com.itheima.config 包下:

package com.itheima.config;

import com.itheima.interceptor.LoginCheckInterceptor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Autowired
    private LoginCheckInterceptor loginCheckInterceptor;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(loginCheckInterceptor).addPathPatterns("/**");
    }
}
其他解决方案

如果不想移动配置类,还可以通过以下方法显式指定扫描路径:

1. 使用 @ComponentScan 注解指定扫描包:

package com.itheima;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan;

@SpringBootApplication
@ComponentScan(basePackages = {"com.itheima", "com.config"})
public class MyApplication {
    public static void main(String[] args) {
        SpringApplication.run(MyApplication.class, args);
    }
}

2. 使用 @Import 注解导入配置类:

package com.itheima;

import com.itheima.config.WebConfig;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Import;

@SpringBootApplication
@Import(WebConfig.class)
public class MyApplication {
    public static void main(String[] args) {
        SpringApplication.run(MyApplication.class, args);
    }
}

通过这些方式,可以确保 Spring Boot 正确扫描和加载拦截器配置类,使拦截器生效。

结论

在使用 Spring Boot 开发 Web 应用时,正确配置包扫描路径非常重要。确保配置类在主应用类的扫描路径内,可以有效解决拦截器不生效的问题。希望这篇文章能够帮助大家更好地理解 Spring Boot 的包扫描机制,并顺利解决开发中遇到的问题。

Spring Boot 进阶- Spring Boot 自定义拦截器详解 在Spring MVC中拦截器有点类似于在Servlet中的过滤器的概念,主要是用来拦截用户求,并且对用户请求进行相应的前置处理。例如鉴权、请求记录、日志处理、判断用户是否登录等等。那么在Spring Boot中如何来实现一个自定义的拦截器呢?如何自定义一个拦截器,首先我们知道在SpringMVC中有一个接口HandlerInterceptor,继承这个接口我们就可是实现一个自定义的拦截器。其源码如下会看到在这个接口中有三个方法如下。 阅读详情

相关推荐

SpringBoot拦截器不生效解决办法

如果在项目中多个类同时继承 WebMvcConfigurationSupport 和实现 WebMvcConfigurer的情况,将会导致只有 WebMvcConfigurationSupport 生效。将这些配置都在一个类中设置,将代码整合至一个类中或者删除 WebMvcConfigurationSupport 配置,拦截器才会生效。继承:WebMvcConfigurationSupport。实现:WebMvcConfigurer。

hkl_Forever的博客 4770

spring boot 拦截器不生效的原因

1. 没加@Component或者@Configuration注解 2. @ComponentScan没扫描到 如果启动类和拦截类在平级或者拦截类父级平级的情况下,ComponentScan一般都会扫描到,除非启动类中指定了; 3.路径配置错了 拦截器的路径配置错误,类不在范围; 4. 已经有类集成了拦截类 项目中有类已经集成了WebMvcConfigurationSupport 或 WebMvcConfigurerAdapter 或 WebMvc...

HDXxiazai的博客 1万+

避免空指针异常:解决Spring Boot拦截器中@Autowried注入redisUtil为null的问题

解决springboot拦截器@Autowried注入为空,导致redisUtil为null空指针问题.

**My Coding Family** 9894

SpringBoot拦截器未生效解决方案

SpringBoot拦截器未生效的可能原因: 注解是否添加齐全(@Component、@Configuration); 是否有多个配置类同时继承了WebMvcConfigurationSupport类,或实现了WebMvcConfigurer, 多个配置类只会生效前一个配置类,后一个配置类不会生效 ; 例: swagger的配置类: @Configuration public class ServletContextConfig extends WebMvcConfigurationSuppor

云泽的博客 8690

Hyper-V集群部署指南

工欲善其事,必先利其器。搭建一个方便管理的服务集群,是分布式学习很重要的环境。 目前流行的虚拟机产品主要为Vmware 和 win10自带的Hyper-V(win10家庭版无此功能),网上关于Vmware的教程更多,显然它更容易上手,但Hyper-V也算是一个很不错的产品,这里记录一下我的学习过程: 目录 Hyper-V的安装 服务集群的搭建 虚拟机的网络通信 NAT网络的搭建 端口映射 Linux的静态IP 虚拟机的自启动问题 Hyper-V的安装 也不能算说是安装,如果你的win1

Swing 6918

告别第三方插件:官方Fused Library如何重塑Android库的合并与发布流程

本文详细介绍了Android官方推出的Fused Library如何替代第三方fat-aar插件,优化Android库的合并与发布流程。通过原生支持、智能依赖管理等优势,Fused Library解决了版本兼容性、依赖传递等核心痛点,提供了更稳定高效的开发体验。文章还提供了迁移实操指南和工程实践建议,帮助开发者顺利过渡到官方方案。

weixin_42561040的博客 252

Springboot拦截器无效,不起作用

Springboot配置拦截器无效,不起作用

lvjun_的博客 1万+

TEA-Tiny Encryption算法在FPGA的实现

在FPGA原型中,我们定义了一个TEA_FPGA模块,该模块包含一个输入数据端口(plain)、一个输入密钥端口(key)和一个输出数据端口(cipher)。在模块中,我们通过32轮的循环处理来实现TEA算法的加密过程,并将最终结果存储在cipher变量中。由于FPGA硬件的高速性能,这种基于HDL的TEA算法实现可以在短时间内完成大量的数据加密处理,从而提高加密效率和性能。总之,在FPGA中实现TEA算法可以大大提高加密效率和性能,通过使用硬件描述语言HDL来实现可以更高效、更快速地完成数据加密操作。

BitSlinger的博客 272

解决springboot配置pagehelper 不生效的问题

解决办法:增加配置文件,配置pagehelper拦截器。

月亮的技术博客 394

Qt软件开发-Qt编译zlib完成文件压缩解压(win10)

在软件开发中进行有需求需要将生成的一些文件打包上传到服务器,或者从服务器下载压缩包下来内部解压。或者自己做一些打包工具,那么使用zlib开源就可以很方便的完成。接下来介绍在zlib在windows下如何利用Qt进行编译,调用,介绍mingw、msvc,32/64位编译办法,完成zip文件打包生成例子。可以单文件压缩打包,多文件压缩打包,目录压缩打包等等。

2216

魔改短线利器DPO指标,频繁交易也能盈利超30倍?手机同花顺可用!

昨天我们提示了一些高位风险板块,今天来看基本上都在跌幅前列。这一波由AIGC驱动的大行情,短期来看可能已经到了尾声。中期大家可以关注30日线和60日线是否有支撑,这种现象级的生产力变革主导的行情不可能直接就凉了——哪怕相关的企业距离从中获利还很遥远。在A股,当前是否盈利并不是当前股价的主要矛盾。保守的同学不妨关注下昨天的机会列表,里边全是一些超跌的板块,短期可能会延续弱势,但是一旦站上20日线,可能就会有一波超跌反弹的行情。AIGC中的资金外流,大概率会有一些低位板块得到临幸。

量化祛魅师 老Q。 1万+

SpringBoot添加Interceptor后addInterceptors方法不执行,拦截器不生效

此处记录一下,项目使用中遇到过这个问题,百度长篇大论每一句有用的。 问题阐述 通过实现【WebMvcConfigurer】类后,addInterceptors方法就不执行,导致拦截器不生效。 原因 原因其实很简单,因为代码中有【WebMvcConfigurationSupport】的继承类,SpringBoot会判断,如果有【WebMvcConfigurationSupport】就不会加载【WebMvcConfigurer】。 解决方案 可在【WebMvcConfigurationSupport】的实现类中

铁蛋的博客 6829

Flow Matching03-01:微分方程【微分方程(描述变化规律的方程):包含未知函数和它的导数的方程】【公式解(精确)、数值解(逼近)】

好的,我将从数学角度详细解释Flow Matching,从高中生能理解的基础知识开始,逐步深入到高级概念。

u013250861的博客 218

Spring Boot拦截器不生效

初步现象 新建的Spring Boot拦截器不生效 初步排查 - 排查拦截器是否注册 - 拦截器的excludePathPatterns等属性是否设置正确 这些都没问题,进行下一步排查 进一步排查 debug DispatchServelt,查看拦截器是否存在handler中 结果发现存在两个RequestMappingHandlerMapping实例,其中一个包含新建的拦截器,另一个没有任何...

zengchenacmer的专栏 2847

C2000ware介绍

C2000的下载安装指南C2000目录。

小柚子的博客 2796

Cadence画PCB的傻瓜式教程

1.原理图1)建立元件库2)建立原理图3)在原理图中画好电路图4)利用MENTOR-GRAPHICS-IPC-7351-LP-VIEWER查看元件的封装信息,用pad designer画焊盘,用pcb editor画元件的封装(对照LP_VIEWER),(也可以使用package wizard)5)在原理图中为元件添加封装信息(键入)6)Drc检查7)生成网表2.Pcb1)设置...

tianpu2320959696的博客 1万+

spring boot 2.x 添加拦截器配置未生效的问题

背景: 今天有一个需求需要拦截除登录相关请求以外的所有请求,并查看request 中是否包含指定的信息,而自然就想到了使用拦截器就可以轻松实现 编写拦截器,获取请求头信息中的test,并打印出来 @Component public class AuthorizationInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, Htt.

yanghaolinyuji的博客 1901

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Spring Cloud Ablibaba Sentinel与Neflix Ribbon结合使用,@SentinelRestTemplate不生效问题

问题:@SentinelRestTemplate不生效 今天使用和@LoadBalanced和@SentinelRestTemplate进行负载均衡和链路流量控制。 @Configuration public class MainConfig { @Bean @LoadBalanced @SentinelRestTemplate( blockHan...

weixin_42213903的博客 1515

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

关于springboot拦截器过滤路径不生效的尝试方案

这里改错试一下,方便演示,在参数上添加了一个注解,原本是不需要的。请求有问题的话,附近会输出较为细致的错误描述,这里会告诉你产生了请求参数不匹配的问题,知道问题那么就好解决了。总结一下,一些问题没有头绪的时候可以尝试开启springboot的日志输出,查看日志描述去推断问题原因。2.检查拼写的路径有没问题,少没少“/”,结尾的"/"不是必须的,根据自己写的路径确定。3.以上都没有问题,也不报错的话可以尝试开启日志输出看看日志的描述,再次运行之后,控制台在接收请求时会输出比较详细的内容。

g1251533394d的博客 613

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

记录 spring boot 配置拦截器不生效

WebConfig 继承了 WebMvcConfigurationSupport 重写了addInterceptors、addREsourcesHandlers 等方法 Swagger2Config 也继承了WebMvcConfigurationSupport 重写了addREsourcesHandlers 配置可以访问静态资源 结果导致WebConfig 中配置拦截器不生效。 把Swagger2Config 中配置可以访问静态资源的方法,配置到 WebConfig 中,去掉...

CMEguagua的博客 468

PageHelper导致自定义Mybatis拦截器不生效

来源:www.jianshu.com/p/8dc9f8a4cce9背景:最近由于公司要做统一的数据变更记录,以前是基于Aop来做的,这样效率很低,而且在做批量处理(insert,updat...

Java笔记虾 1865

Spring Boot集成Mybatis Plus通过Pagehelper实现分页查询

Spring Boot 引入 starter 后自动生效,对分页插件进行配置时,在 Spring Boot 对应的配置文件 application.[properties|yaml] 中配置。配置的字段中取值,查找到合适的值时就会自动分页。方法,增加了该参数来配置参数映射,用于从对象中根据属性名取值, 可以配置。正常情况,没有分页是有以张开头有三条数据,有分页的情况下 张1,张2。返回结果有疑问:返回的是没有分页,只要是张开头的数据都返回了。,分页插件会从查询方法的参数值中,自动根据上面。

极客鼠之家 5536

springboot拦截器不生效的原因

可能造成拦截器不生效的原因: 以前遇到要使用springboot拦截器却始终未生效的状况,查了网上的博客,大抵都是@Component,@Configuration注解未加,或是使用@ComponentScan增加包扫描,但是尝试后都没有生效,最后才发现是因为之前为了解决跨域问题配置类继承了WebMvcConfigurationSupport,并重写了里面的方法。之后的拦截器配置类同样继承了...

xmw_ytc的博客 1万+

Spring Boot实战:拦截器

什么是拦截器:拦截器在SpringBoot中主要有以下几个作用: 1.2拦截器的基本使用1.⾃定义拦截器:实现HandlerInterceptor接⼝,并重写其所有⽅法 2.注册配置拦截器:实现WebMvcConfigurer接⼝,并重写addInterceptors⽅法 3.启动服务, 试试访问任意请求, 观察后端⽇志 可以看到preHandle ⽅法执⾏之后就放⾏了, 开始执⾏⽬标⽅法, ⽬标⽅法执⾏完成之后执⾏ postHandle和afterCompletion⽅法.

LHY537200的博客 7038
上一篇: github提交项目 解决初次提交80%的问题
下一篇: 小众解决方法-PLSQL连接Oracle:ORA-12154: TNS: 无法解析指定的连接标识符
True_aFalse
博客等级 码龄6年 39粉丝 10原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值