自定义过滤器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进行注入。
以上是个人折腾了很久后的总结,希望能帮助到同样遇到这问题的小伙伴们……