Spring boot中filter类不能注入@Autowired变量问题
作者:Amo_lt 时间:2023-04-24 14:17:41
filter类不能注入@Autowired变量
问题描述
项目中的登录是用了shiro以及filter * 。输入正确的账号密码之后却不能正常登录。调试代码发现是filter类中定义的变量userService没有值,为null,该变量采用的方式是@Autowired自动注入。由此我认为shiro配置类还是有点问题。
解决办法
在shiroConfig.java(shiro相关bean的定义类)中加入一个bean用来自动注入filter中的变量
@Bean
public FilterRegistrationBean myLoginRegistrationBean() {
FilterRegistrationBean filterRegistration = new FilterRegistrationBean();
filterRegistration.setFilter(new DelegatingFilterProxy("shiroFilter"));
// 该值缺省为false,表示生命周期由SpringApplicationContext管理,设置为true则表示由ServletContainer管理
filterRegistration.addInitParameter("targetFilterLifecycle", "true");
filterRegistration.setAsyncSupported(true);
filterRegistration.setEnabled(true);
filterRegistration.setDispatcherTypes(DispatcherType.REQUEST);
// filterRegistration.addUrlPatterns("/*");// 可以自己灵活的定义很多,避免一些根本不需要被Shiro处理的请求被包含进来
// filterRegistration.setName("MyLoginFilter");
// filterRegistration.setOrder(1);
return filterRegistration;
}
这里面需要注意的是:
filterRegistration.setFilter(new DelegatingFilterProxy("shiroFilter"));
这行代码,里面的shiroFilter表示另一个bean。如果你只有一个filter类,可以直接将shiroFilter替换为你的filter对象,如:
filterRegistration.setFilter(new MyUserFilter());
更正:
上面那行单独给filter注入值的写法不对!,应该是先给这个filter定义一个bean:
@Bean(name = "myUserFilter")
public MyUserFilter myUserFilterBean() {
MyUserFilter bean=new MyUserFilter();
return new MyUserFilter();
}
然后:
filterRegistration.setFilter(myUserFilterBean());
因为博主项目中有三个filter类,所以不能用第二种new 对象定义,即时写了三个这种bean,还是只有一个filter中的变量能够被注入!所以只能用new DelegatingFilterProxy(“shiroFilter”)方式,因为shiroFilter中已经有了三个filter的定义。其余的相关bean如下:
@Bean(name = "formAuthenticationFilter")
public MyLoginFilter myLoginFilterBean() {
MyLoginFilter bean=new MyLoginFilter();
bean.setUsernameParam("username");
bean.setPasswordParam("password");
bean.setRememberMeParam("rememberMe");
bean.setLoginUrl("/admin/login");
bean.setSuccessUrl("/admin/index.view");
return bean;
}
@Bean(name = "sysUserFilter")
public SysUserFilter sysUserFilterBean() {
// SysUserFilter bean=new SysUserFilter();
return new SysUserFilter();
}
@Bean(name = "myUserFilter")
public MyUserFilter myUserFilterBean() {
// MyUserFilter bean=new MyUserFilter();
return new MyUserFilter();
}
@SuppressWarnings("null")
@Bean(name = "shiroFilter")
public ShiroFilterFactoryBean shiroFilterFactoryBean(@Qualifier("securityManager") DefaultWebSecurityManager securityManager) {
logger.info("注入Shiro的Web过滤器-->shiroFilter", ShiroFilterFactoryBean.class);
ShiroFilterFactoryBean bean=new ShiroFilterFactoryBean();
bean.setSecurityManager(securityManager);
bean.setLoginUrl("/admin/login");
Map<String, Filter> filters = bean.getFilters();//获取filters
filters.put("authc", myLoginFilterBean()); //filters中放入三个filter
filters.put("sysUser", sysUserFilterBean());
filters.put("user", myUserFilterBean());
bean.setFilters(filters);
LinkedHashMap<String, String> filterChainDefinitionMap=new LinkedHashMap<>();
filterChainDefinitionMap.put("/admin/login", "authc");
filterChainDefinitionMap.put("/admin/api/**", "sysUser");
filterChainDefinitionMap.put("/admin/**", "user");
bean.setFilterChainDefinitionMap(filterChainDefinitionMap);
return bean;
}
@Component注入@Autowired为空
上面的注入是没问题的,我的问题出在调用的地方:
直接new出来的对象是不在spring容器中的,正确的方式是:
来源:https://blog.csdn.net/Amo_lt/article/details/78489937
标签:Springboot,filter,注入,@Autowired
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
Java中启动线程start和run的两种方法
2023-09-12 10:58:29
Java实现TopK问题的方法
2023-11-10 20:32:14
mybatis多表查询的实现(xml方式)
2021-07-11 01:21:38
![](https://img.aspxhome.com/file/2023/5/79235_0s.png)
Unity3d 使用Gizmos画一个圆圈
2022-05-22 05:10:52
![](https://img.aspxhome.com/file/2023/2/104332_0s.jpg)
IDEA JetBrains Mono字体介绍和安装教程(详解)
2022-01-23 17:57:51
![](https://img.aspxhome.com/file/2023/5/120535_0s.jpg)
C++ 中String 替换指定字符串的实例详解
2021-06-05 19:08:23
.net文件上传时实现通过文件头确认文件类型的方法
2021-08-01 09:05:32
Java使用excel工具类导出对象功能示例
2022-07-04 23:06:50
Java内存溢出和内存泄露
2023-01-21 17:48:48
java多线程入门知识及示例程序
2021-11-30 03:17:58
SpringBoot使用Druid数据源的配置方法
2023-08-19 19:52:11
![](https://img.aspxhome.com/file/2023/2/106082_0s.png)
SpringBoot如何实现分离资源文件并打包
2023-02-18 12:01:49
![](https://img.aspxhome.com/file/2023/1/85501_0s.png)
Android 拍照后返回缩略图的两种方法介绍
2023-02-06 02:06:28
![](https://img.aspxhome.com/file/2023/8/130348_0s.jpg)
Java实现插入排序实例
2023-02-13 17:09:21
详解java中接口与抽象类的区别
2021-09-12 03:21:39
MyBatis实践之DAO与Mapper
2022-09-28 23:19:32
![](https://img.aspxhome.com/file/2023/7/122297_0s.png)
Android防止按钮过快点击造成多次事件的解决方法
2022-03-30 08:35:58
第1个Android应用程序 Android制作简单单页导航
2022-09-27 22:23:26
![](https://img.aspxhome.com/file/2023/0/122050_0s.png)
关于javascript冒泡与默认事件的使用详解
2023-05-16 07:16:32
Intellij Idea修改代码方法参数自动提示快捷键的操作
2022-11-19 08:08:37
![](https://img.aspxhome.com/file/2023/8/75748_0s.jpg)