今天被人提了个问题——在过滤器(Filter)中注入Bean后拿不到对象(为null),如何避免这个坑?

废话不多说了,咱们直接看解决方案代码吧!

首先来看一下过滤器中的内容:

认证过滤器配置了,获取用户输入用户名和密码方法,认证成功方法及认证失败处理方法,以及日志入库封装代码;

当认证成功后,记录日志入库的时候,会发现此处的journalService是null,无法获取相对应的Bean对象,

/*** 认证过滤器*/
public class TokenLoginFilter extends UsernamePasswordAuthenticationFilter {private Logger logger = LoggerFactory.getLogger(TokenLoginFilter.class);private TokenManager tokenManager;private JournalService journalService;private RedisTemplate redisTemplate;// 权限管理工具,由SpringSecurity封装提供private AuthenticationManager authenticationManager;public TokenLoginFilter(AuthenticationManager authenticationManager, TokenManager tokenManager, RedisTemplate redisTemplate,JournalService journalService) {this.authenticationManager = authenticationManager;this.tokenManager = tokenManager;this.redisTemplate = redisTemplate;this.journalService = journalService;this.setPostOnly(false);}// 1 获取表单提交用户名和密码@Overridepublic Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response)throws AuthenticationException {//获取表单提交数据try {User user = new ObjectMapper().readValue(request.getInputStream(), User.class);return authenticationManager.authenticate(new UsernamePasswordAuthenticationToken(user.getUsername(),user.getPassword(),new ArrayList<>()));} catch (IOException e) {e.printStackTrace();throw new RuntimeException();}}// 2 认证成功调用的方法@Overrideprotected void successfulAuthentication(HttpServletRequest request,HttpServletResponse response, FilterChain chain, Authentication authResult)throws IOException, ServletException {insertJournal(user,request);ResponseUtil.out(response, apiResult);}// 3  认证失败调用的方法protected void unsuccessfulAuthentication(HttpServletRequest request, HttpServletResponse response, AuthenticationException failed)throws IOException, ServletException {logger.info("认证登录失败,失败原因:{}",failed.getMessage());ApiResult apiResult = new ApiResult();apiResult.setResultCode(ApiResponse.FAIL.getResCode());apiResult.setMsg("用户名密码错误");ResponseUtil.out(response, apiResult);}@Asyncpublic void insertJournal(SecurityUser user,HttpServletRequest request) throws BaseException {Journal journal = new Journal();journal.setCreateTime(new Date());journal.setMethod("login");journal.setName(user.getUsername());journal.setIpAddress(IpUtils.getIp(request));journal.setRemark("登录成功");journalService.insertSelective(journal);}}

通过上面的代码便是拦截其中注入Bean的操作,此时如果没有任何配置,则注入的Bean全部获取不到对象值,全部为null

接下来我们看解决方案:

次配置类中公共构造函数中会按照系统注入所需要的tokenManager、redisTemplate、defaultPasswordEncoder、userDetailsService、journalServiced对象。

相对应的配置设置会实现商法所说的注入动作,这样即可完成正确的Bean注入操作

@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class TokenWebSecurityConfig extends WebSecurityConfigurerAdapter {private TokenManager tokenManager;private RedisTemplate redisTemplate;private DefaultPasswordEncoder defaultPasswordEncoder;private UserDetailsService userDetailsService;private JournalService journalService;@Autowiredpublic TokenWebSecurityConfig(UserDetailsService userDetailsService, DefaultPasswordEncoder defaultPasswordEncoder,TokenManager tokenManager, RedisTemplate redisTemplate,JournalService journalService) {this.userDetailsService = userDetailsService;this.defaultPasswordEncoder = defaultPasswordEncoder;this.tokenManager = tokenManager;this.redisTemplate = redisTemplate;this.journalService = journalService;}/*** 配置设置* @param http* @throws Exception*/// 设置退出的地址和token,redis操作地址@Overrideprotected void configure(HttpSecurity http) throws Exception {http.cors();http.exceptionHandling().authenticationEntryPoint(new UnauthEntryPoint()) // 没有权限访问.and().csrf().disable().authorizeRequests().anyRequest().authenticated() //任何请求,登录后可以访问.and().logout().logoutUrl("/index/logout")//退出路径.addLogoutHandler(new TokenLogoutHandler(tokenManager,redisTemplate)).and().addFilter(new TokenLoginFilter(authenticationManager(), tokenManager, redisTemplate,journalService)).addFilter(new TokenAuthFilter(authenticationManager(), tokenManager, redisTemplate)).httpBasic();}
}

这一步中的关键便是构造函数中为注入Bean赋值,然后配置Filter时注入对象即可。

好了,这样即可完成过滤器中注入Bean操作,觉得有帮助,帮小编点个赞吧!

更多编程内容,请扫码关注《coder练习生》,如果觉得有用,也可赠送作者一杯咖啡

Springboot过滤器中注入Bean相关推荐

  1. spring-boot 引入xml注入bean

    2019独角兽企业重金招聘Python工程师标准>>> spring-boot 引入xml注入bean 配置 public class TestServiceImpl impleme ...

  2. springboot 在线程中注入bean,解决注入bean为null的问题

    解决问题: 在我们开发过程中总会遇到比如在线程中需要代用service或者mapper等读取数据库,或者某些自动注入bean失效的情况 问题分析: 在线程中因为线程是安全的,所以是无法自动注入bean ...

  3. SpringBoot:yaml配置注入bean

    SpringBoot使用一个全局的配置文件 , 配置文件名称是固定的. 有分成application.properties和application.yml两种结构,这两种结构: application ...

  4. springboot线程中获取bean

    在线程中是无法直接使用Spring Beans,但是又需要使用Spring中的bean执行方法 1:使用ApplicationContextAware在线程中直接获取bean 创建Applicatio ...

  5. 静态方法中注入bean对象

    注意:别忘记写@Component注解 @Component public class StructUtil {private static StructService structService;p ...

  6. java filter注入,Spring-boot中Filter注入bean

    Spring-boot中Filter注入bean 在spring中使用Filter的方式不用再多说,但是通常情况下我们在使用filter中都可能会注入部分配置的类或者部分具有特殊功能的业务类. 在这种 ...

  7. 关于springboot工具类中@Autowired注入bean,用static直接修饰,静态方法使用bean时报空指针异常错误...

    错误场景: springboot + mybatis 在工具类的静态方法中,需要使用mapper(其他bean也一样),所以最开始直接使用@Autowired进行了注入,代码如下: @Autowire ...

  8. autowired 静态方法使用_关于springboot工具类中@Autowired注入bean,用static直接修饰,静态方法使用bean时报空指针异常错误...

    错误场景: springboot + mybatis 在工具类的静态方法中,需要使用mapper(其他bean也一样),所以最开始直接使用@Autowired进行了注入,代码如下: @Autowire ...

  9. SpringBoot中在除controller以外注入service-过滤器中注入

    一般我们都是在controller层注入service那么如何在过滤器中注入service呢 一般使用过滤器在启动类中添加如下代码 1 @SpringBootApplication 2 @Mapper ...

最新文章

  1. C语言竟成TIOBE年度编程语言候选!苹果iPhone 7卖得最好!
  2. SQL学习之数据列去空格函数
  3. linux 新开窗口到最前,怎么设置一个窗口总是在电脑桌面的最前
  4. 社交平台舆情分析项目的总结和感想(LU学习,EM,KNN)(二)
  5. iOS之深入解析内存管理散列表SideTables和弱引用表weak_table的底层原理
  6. matlab2015b修改快捷键
  7. Word报告自动生成(例如 导出数据库结构)
  8. FZU Problem 2238 Daxia Wzc's problem
  9. 最新自然指数出炉,哪些高校表现突出?
  10. git-stash简单用法
  11. 微信小程序开发遇到的bug及填坑
  12. Nginx upstream性能优化
  13. Android系统之Recovery移植教程 【转】
  14. Python 入门 Day5
  15. SQL Server里面如何导出包含数据的SQL脚本
  16. k3导入账套_金蝶k3凭证导入导出的操作方法 金蝶k3操作指南
  17. LM7805:电压调节器的工作原理
  18. Apache ShenYu 入门
  19. 如何把电脑视频转换成MP4格式?视频转换用嗨格式
  20. spring2.5.6升级到4.3.7常见问题

热门文章

  1. KeyMob聚合广告携手开发者 共谋移动应用广告的福利
  2. 【数据应用案例学习】(一)—— 基于用户画像的腾讯大数据防刷架构
  3. linux音频文件格式转换,Linux下常见音频格式之间的转换方法
  4. 电脑无法升级windows11的解决办法
  5. Linux中升级GLIBC,终结版,测试通过
  6. 元宇宙电商|“NFG”是什么,企业该如何利用元宇宙实现增值呢?
  7. 【思维导图】算法设计与分析
  8. 哪个软件可以识别手写字?推荐好用的办法
  9. 为echarts的叠加柱状图设置颜色
  10. 经典游戏----飞机大战