filter類不能注入@Autowired變量
問題描述
項目中的登錄是用了shiro以及filter攔截器。輸入正確的賬號密碼之后卻不能正常登錄。調試代碼發(fā)現(xiàn)是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中已經(jīng)有了三個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容器中的,正確的方式是:
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持服務器之家。
原文鏈接:https://blog.csdn.net/Amo_lt/article/details/78489937