为什么你写的拦截器中不能注入Java bean?

Mac版Burp Suite专业版破解与汉化完整指南 在Web安全测试领域,Java应用程序的许可证验证机制与本地化实现是常见的技术课题。其原理通常涉及Java Agent技术,通过在JVM启动时动态修改字节码,实现对软件授权状态的校验逻辑进行拦截与重写,从而绕过官方验证。同时,软件界面的国际化(i18n)与本地化(l10n)则依赖于资源文件的替换与加载。从技术价值角度看,深入理解这些机制不仅能满足特定场景下的工具定制需求,更能加深对Java安全机制、软件保护与逆向工程的理解。在实际的工程实践中,安全研究人员与开发者常面临功能受限或语言障碍的挑战,尤其是在渗透 阅读详情

一、如何实现拦截器

在Spring Boot项目中,拦截器经常被用来做登陆验证,日志记录等操作。拦截器是Spring提供的,所以可以将拦截器注成bean,由IOC容器来管理。实现拦截器的方式很简单,主要由以下两个步骤:

  1. 自定义拦截器类实现HandlerInterceptor接口
  2. 自定义WebMvc配置类实现WebMvcConfigurer接口,添加自定义拦截器类

简要实现代码如下:

自定义拦截器 LoginInterceptor:

public class LoginInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

        String token = request.getHeader("token");
        if(StringUtils.isEmpty(token)){
       ...
            return false;
        }
        return true;
    }
}

配置自定义拦截器:

@Configuration
public class WebConfiguration implements WebMvcConfigurer {

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new LoginInterceptor())
             // 拦截的请求
                .addPathPatterns("/**")
             // 不用拦截的请求
                .excludePathPatterns("/login");
    }
}

这个拦截器的主要作用就是拦截所有访问请求,验证所带token是否有效,当token验证成功后,才能访问我们的业务接口。这时候就需要提供一个验证token有效性的接口,在拦截器中验证token,由于拦截器是Spring提供的,因此很容易想到使用@Component注解将拦截器注成一个 bean。然后使用@Autowired注解将验证token的类注入到拦截器进行验证。

改造完的代码如下:

验证token接口类:

@Component
public class TokenUtil {
    /**
     * 验证token 是否有效
     */
    public boolean checkToken(String token){
        ...
    }
}

改造完的拦截器代码如下:

@Component
public class LoginInterceptor implements HandlerInterceptor {

    @Autowired
    private TokenUtil tokenUtil;

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        if(!tokenUtil.checkToken(token)){
            ...
            return false;
        }
        return true;
    }
}

调用接口时发现,TokenUtil并没有被注入进来!明明代码写的没问题,为什么不能正常注入TokenUtil呢?

仔细观察我们自定义的配置类WebConfiguration,在添加拦截器的时候用的是new LoginInterceptor(),如果想要拦截器生效,必须将拦截器配置到WebMvc的配置类中,就是我们自定义的WebConfiguration类。现在添加拦截器的时候是 new 了一个拦截器,也就是说并没有将拦截器托管给IOC容器,所以就无法引入Spring的bean对象。

二、如何将拦截器托管给IOC容器

解决问题的思路也很简单,就是将拦截器也托管给IOC容器,这样容器内的对象就可以相互注入了。总共有以下三种方式进行处理上述问题。

2.1 在WebConfiguration注入拦截器

拦截器代码不变,在拦截器上使用@Component,同时在WebConfiguration中使用@Autowired注解将拦截器注入。

拦截器代码:

@Component
public class LoginInterceptor implements HandlerInterceptor {
}

配置类代码:

@Configuration
public class WebConfiguration implements WebMvcConfigurer {

    @Autowired
    private LoginInterceptor loginInterceptor;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(loginInterceptor);
    }
}

2.2 在WebConfiguration将拦截器注成bean

拦截器无需增加@Component注解,在WebConfiguration类中使用@Bean注解将拦截器注成bean。

拦截器代码:

public class LoginInterceptor implements HandlerInterceptor {
}

配置类代码:

@Configuration
public class WebConfiguration implements WebMvcConfigurer {

    @Bean
    public LoginInterceptor loginInterceptor(){
        return new LoginInterceptor();
    }

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor( loginInterceptor());
    }
}

2.3 通过构造器处理

思路是在WebConfiguration类中注入需要的验证token的业务类,然后在初始化拦截器的时候将业务类通过构造器带入拦截器中,这样就不用把拦截器注成Spring Bean对象了。

拦截器代码:

public class LoginInterceptor implements HandlerInterceptor {

    private TokenUtil tokenUtil;

    public LoginInterceptor(TokenUtil tokenUtil) {
        this.tokenUtil = tokenUtil;
    }
}

配置类代码:

@Configuration
public class WebConfiguration implements WebMvcConfigurer {

    @Autowired
    private TokenUtil tokenUtil;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new LoginInterceptor(tokenUtil));
    }
}

三、总结

网上关于拦截器的代码基本都是通过new一个拦截器进行配置的,这时候就会出现无法注入其他bean的情况。很多人想当然地直接在拦截器加@Component注解使其成为一个bean对象。这是一种错误的做法。我们需要保证的是在WebMvc配置类中添加的拦截器是Spring 的一个bean对象,也就是说我们需要将拦截器注成一个bean,同时将这个bean添加的WebMvc配置类中。

企业AI选型大揭秘:扣子(Coze) Bot与微信对话开放平台深度剖析 本文对比分析了字节跳动的扣子(Coze)Bot和腾讯的微信对话开放平台两款AI聊天机器人解决方案。扣子(Coze)Bot凭借强大的大模型支持、丰富的插件生态、低代码开发及多平台部署能力,在功能丰富度和灵活性方面表现突出,适合技术实力强、业务场景复杂的企业。微信对话开放平台则依托微信生态优势,在客户服务和营销推广场景中更具优势,其零门槛接入方式更适合技术能力较弱的企业。企业在选型时应综合考虑规模、预算、业务场景和技术能力等因素,选择最适合的AI解决方案,以充分发挥AI技术价值,提升企业竞争力。 阅读详情

相关推荐

机器学习kaggle案例:风控评分卡模型(Give_Me_Some_Credit)

kaggle链接:https://www.kaggle.com/c/GiveMeSomeCredit ipynb文件:https://github.com/824024445/KaggleCases/blob/master/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0kaggle%E6%A1%88%E4%BE%8B%EF%BC%9A%E9%A3%8E%E6%8E%A7%...

weixin_42662126的博客 1万+

Mybatis 拦截器/插件 内注入bean的问题解决

最早是想用Mybatis拦截器/插件 拦截结果集并修改! 看看文档和网上的博客,了解了大概也写了个demo;demo使用的时候没有问题所以没有深入研究 Mybatis 拦截器/插件 之前使用new的方式配置到配置类中 使拦截器生效 后来改成注入的方式的时候出现了问题Mybatis 拦截器/插件 之前使用new的方式配置到配置类中 使拦截器生效 后来改成注入的方式的时候出现了问题......

性感的杏鲍菇的专栏 3232

BDD测试之Behave使用入门

BDD测试(Behavior-Driven Development Testing)是一种基于“行为驱动开发”(BDD)理念。

想要成为酷盖但是失败的小明 581

经典面试题-请解释自动装配模式的区别?

在Spring框架中共有5种自动装配,让我们逐一分析。 no: 这是Spring框架的默认设置,在该设置下自动装配是关闭的,开发者需要自行在bean定义中用标签明确的设置依赖关系。 byName: 该选项可以根据bean名称设置依赖关系。当向一个bean中自动装配一个属性时,容器将根据bean的名称自动在在配置文件中查询一个匹配的bean。如果找到的话,就装配这个属性,如果没找到的话就报错。 b...

逍遥云恋 1401

EGE基础入门篇(一):绘图基础知识

EGE绘图所需要了解的相关基础知识

依稀_yixy的博客 2万+

HWSD2.0土壤数据处理实战:从下载到属性提取全流程解析

本文详细解析了HWSD2.0全球土壤数据库从数据下载、属性筛选到GIS空间连接与提取的全流程实战方法。重点介绍了如何利用ArcGIS Pro等工具,将土壤单元编码与黏粒含量等属性表关联,最终生成全球土壤属性专题栅格图,为农业规划与生态研究提供关键数据支撑。

weixin_29214691的博客 611

Springboot在拦截器中无法调用Service层(注入Bean失效)

Springboot在拦截器中无法调用Service层(注入Bean失效) 困扰了一周,一度放弃,只能用的伪造数据,终于找到问题所在!拦截器中注入ServiceBean失效! 报错信息 空指针!无法使用注入的Service,因为根本没用注入进来!!!不光是无法注入,new也不行,哭。 原因 原因: 拦截器加载是在springcontext创建之前完成 解决 自己用工厂或者使用@Bean在拦截器初始化之前让类加载 参考:https://blog.youkuaiyun.com/wmh13262227870/article/

weixin_45855671的博客 2498

MobaXterm-SSH远程连接Ubuntu

我们常常在公司的服务器上面的虚拟机进行交叉编译,所以才需要我们用远程终端工具MobaXterm去接入虚拟机。然后把我们在window用VScode编辑好的代码拖拽上传到服务器,等待服务器编译完把生成的可执行文件从服务器拖拽下来,烧录到板子运行。

weixin_50257954的博客 3477

解决mybatis拦截器无法注入spring bean的问题

公司要整合rabbitmq与mybatis拦截器做一个数据同步功能。 整合过程中大部分环节都没什么问题,就是遇到了mybatis拦截器 @Intercepts(@Signature(type = Executor.class, method = "update", args = {MappedStatement.class, Object.class})) @Component public class MyBatisInterceptor implements Interceptor 无法通过

wdjnb的博客 4952

Autosar PNC网络管理配置-UserData的使用

之前配置的网络管理报文中的data都由ComM管理,后面客户新增了需求,最后两个byte需要发送,本文记录一下相关配置的修改能配置生成的,尽量不手码,毕竟手写一堆bug~

赞的博客 1907

Vite 任意文件读取漏洞复现(CVE-2026-39363)

Vite开发服务器 WebSocket中的fetchModule方法未实施server.fs访问控制,导致攻击者可通过WebSocket连接并读取服务器上的任意文件(CVE-2026-39363)

iSee857的博客 223

Spring--解决拦截器中注入Bean失败的问题

说明 本文用示例介绍如何解决拦截器中注入Bean失败的问题。 场景 Token拦截器中需要用@Autowired注入JavaJwtUtil类,结果发现注入的JavaJwtUtil为Null。 原因 拦截器的配置类是以new JwtInterceptor的方式使用的,那么这个JwtInterceptor不受Spring管理。因此,里边@Autowired注入JavaJwtUtil是不会注入进去的。.........

IT利刃出鞘的博客 3580

【WRF安装第三期(Ubuntu)】搭建WRF编译所需系统-第三方依赖库安装

WRF安装第三期:搭建WRF编译所需系统-第三方依赖库安装

WW、forever的博客 3139

java 拦截器_为什么你写的拦截器中不能注入Java bean?

来源:Java旅途一、如何实现拦截器在Spring Boot项目中,拦截器经常被用来做登陆验证,日志记录等操作。拦截器是Spring提供的,所以可以将拦截器注成bean,由IOC容器来管理。实现拦截器的方式很简单,主要由以下两个步骤:自定义拦截器类实现HandlerInterceptor接口自定义WebMvc配置类实现WebMvcConfigurer接口,添加自定义拦截器类简要实现代码如下:自定义...

weixin_39710249的博客 136

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

spring 拦截器_为什么你写的拦截器中不能注入Java bean?

一、如何实现拦截器在Spring Boot项目中,拦截器经常被用来做登陆验证,日志记录等操作。拦截器是Spring提供的,所以可以将拦截器注成bean,由IOC容器来管理。实现拦截器的方式很简单,主要由以下两个步骤:自定义拦截器类实现HandlerInterceptor接口自定义WebMvc配置类实现WebMvcConfigurer接口,添加自定义拦截器类简要实现代码如下:自定义拦截器 ...

weixin_39851279的博客 358

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

@bean注解只能写在配置类中吗_为什么你写的拦截器中不能注入Java bean?

一、如何实现拦截器在Spring Boot项目中,拦截器经常被用来做登陆验证,日志记录等操作。拦截器是Spring提供的,所以可以将拦截器注成bean,由IOC容器来管理。实现拦截器的方式很简单,主要由以下两个步骤:自定义拦截器类实现HandlerInterceptor接口自定义WebMvc配置类实现WebMvcConfigurer接口,添加自定义拦截器类简要实现代码如下:自定义拦截器 ...

weixin_29072299的博客 314

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

如何防止token被拦截_为什么你写的拦截器中不能注入Java bean?

来源:Java旅途一、如何实现拦截器在Spring Boot项目中,拦截器经常被用来做登陆验证,日志记录等操作。拦截器是Spring提供的,所以可以将拦截器注成bean,由IOC容器来管理。实现拦截器的方式很简单,主要由以下两个步骤:自定义拦截器类实现HandlerInterceptor接口自定义WebMvc配置类实现WebMvcConfigurer接口,添加自定义拦截器类简要实现代码如下:自定义...

weixin_32441957的博客 194

Spring IOC拦截器中你为什么不能注入Java bean?

一、如何实现拦截器 在Spring Boot项目中,拦截器经常被用来做登陆验证,日志记录等操作。拦截器是Spring提供的,所以可以将拦截器注成bean,由IOC容器来管理。实现拦截器的方式很简单,主要由以下两个步骤: 自定义拦截器类实现HandlerInterceptor接口 自定义WebMvc配置类实现WebMvcConfigurer接口,添加自定义拦截器类 最新2021整理收集的一线互联网公司面试真题(都整理成文档),有很多干货,包含netty,spring,线程,spring cloud等详细讲解,

a3961401的博客 3480

为什么你写的拦截器注入不了 Java bean?

网上关于拦截器的代码基本都是通过new一个拦截器进行配置的,这时候就会出现无法注入其他bean的情况。很多人想当然地直接在拦截器加@Component注解使其成为一个bean对象。这是一种错误的做法。

Java旅途 1031

拦截器中不能注入Java bean?

一、如何实现拦截器 在Spring Boot项目中,拦截器经常被用来做登陆验证,日志记录等操作。拦截器是Spring提供的,所以可以将拦截器注成bean,由IOC容器来管理。实现拦截器的方式很简单,主要由以下两个步骤: 自定义拦截器类实现HandlerInterceptor接口 自定义WebMvc配置类实现WebMvcConfigurer接口,添加自定义拦截器类 简要实现代码如下: 自定义拦截器LoginInterceptor: public class LoginInterc.

hanjiaqian的博客 1005

java 拦截器_为什么你写的拦截器注入不了Java bean?

一、如何实现拦截器在项目中,拦截器经常被用来做登陆验证,日志记录等操作。拦截器是Spring提供的,所以可以将拦截器注成bean,由IOC容器来管理。实现拦截器的方式很简单,主要由以下两个步骤:自定义拦截器类实现HandlerInterceptor接口自定义WebMvc配置类实现WebMvcConfigurer接口,添加自定义拦截器类简要实现代码如下:自定义拦截器 LoginInterceptor...

weixin_39614877的博客 101

拦截器不能注入bean的问题原因和解决方案

import com/*** 拦截器} }/*** 拦截器} }/*** 拦截器} }import com/*** 拦截器} }/*** 拦截器} }/*** 拦截器} }/*** 拦截器} }Blacklist。

qq_56352553的博客 1252

springboot中注册拦截器时,拦截器中注入bean对象失效问题

解决方案:在注册拦截器时,先将其放入到ioc容器中,可以通过方法的返回值使用@bean将对象注入到Ioc容器中,需要注意的是通过方法返回值的方式注入对象时,方法名将作为bean对象的idpackage cn.wj.api.interceptor; import cn.wj.utils.JSONResult; import cn.wj.utils.JsonUtils; ...

qq_42863620的博客 1677
上一篇: 从应用到底层:36张图带你进入Redis世界(下)
下一篇: MySQL死锁分析与解决之路
JavaMonsterr
博客等级 码龄4年 211粉丝 481原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值