在spring的过滤器中注入Redis工具类(@autowire会失效可使用这个方法)

本文探讨了在Web项目中使用Spring Filter时遇到的Bean注入失败问题。问题源于Filter初始化早于Spring管理的Bean,导致无法直接通过@Autowired注解注入。解决方案是在applicationContext.xml中配置context:component-scan,确保Filter中的Bean能在Spring上下文中初始化。同时,文章提到了配置顺序的重要性,以及如何在Filter的init方法中手动获取并注入Bean。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

自定义过滤器Filter

package com.sf.XWFS.filter;


@Component
public class MyPasssWordLoginFilter implements Filter {

    @Autowired
    private RedisUtil redisUtil;
  
    /**
     * 校验用户名密码输错5次直接返回锁定30分钟提示
     *
     * @param res
     * @param userName
     */
    private void checkLoginFive(HttpServletResponse res, String userName) {
        String msg;
        Response rs;
        Integer count = 0;
        Object o = null;
        String checkLoginKey = LOGINKEY + userName;
        try {
            o = redisUtil.get(checkLoginKey);
        } catch (Exception e) {
            System.out.println("redis获取数据失败 = " + e);
            e.printStackTrace();
        }
        System.out.println("###userName=:" + o);
        if (!java.util.Objects.isNull(o)) {
            count = Integer.valueOf(o.toString());
            Integer num = 5;
            if (num <= count) {
                msg = "账号被锁定30分钟,请稍后在试!";
                AuditLoggerUtils.loginLog(String.valueOf(OptResult.FAIL.getValue()), msg);
                rs = ResponseHelper.buildFail(msg);
                CasHelper.responseOutWithJson(res, rs);

            }
        }
        return;
    }

   
}

WEB.xml配置


	<filter>
		<filter-name>myPasssWordLoginFilter</filter-name>
		<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
		<init-param>
			<param-name>targetBeanName</param-name>
			<param-value>myPasssWordLoginFilter</param-value>
		</init-param>
		<init-param>
			<param-name>targetFilterLifecycle</param-name>
			<param-value>true</param-value>
		</init-param>
	</filter>
	<filter-mapping>
		<filter-name>myPasssWordLoginFilter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>

spring-context.xml

<!-- 重构登陆过滤器配置,过滤器内部依赖的bean,需要单独注入到Spring-->
	<bean id="myPasssWordLoginFilter" class="com.sf.XWFS.filter.MyPasssWordLoginFilter"></bean>
	<bean id="redisUtil" class="com.sf.XWFS.utils.redis.RedisUtil"></bean>

原因

1.问题描述

在web项目中,使用filter过滤器十分常见,但是在过滤器中spring Bean即使在配置文件中配置了扫描filter对应的包,也无法正确注入spring 管理的Bean。

2.原因

大概如下<摘自知乎>:

这其中涉及到web启动的原理。
  众所周知,web应用启动的顺序是:listener->filter->servlet,而因为项目应用了spring mvc,所以我们会有两个配置文件(applixationContext.xml和springMVC-sevlet.xml),我们在配置 spring时会用到spring的listener,它会读取application.xml里的配置对spring context进行初始化;而springMVC-servlet.xml则是在spring mvc的dispathServlet启动的时候读取进行配置。而如果项目里用到了注解,则需要在springMVC-servlet.xml中加上“”。
  进入重点。 问题就是项目启动时,先初始化listener,因此配置在applicationContext.xml里的bean会被初始化和注入;然后再来就filter的初始化,再接着才到我们的dispathServlet的初始化,因此,当我们需要在filter里注入一个注解的bean时,就会注入失败,因为filter初始化时,注解的bean还没初始化,没法注入。所以,如果想要在filter里注入注解bean的话,就要在applicationContext.xml里配置context,也就是上面说的那句配置。在这里配置时需要注意的是,需要把tx和aop的配置放在最下面,否则也会导致spring的context初始化失败。 把配置弄好之后,我们就在filter的init方法里,通过获取webApplicationContext的getBean方法对需要的bean进行注入。
  以上是个人折腾了很久后的总结,希望能帮助到同样遇到这问题的小伙伴们……

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值