这次在项目中编写Token代码逻辑的时候,遇到了一个空指针问题,经过排查发现,Filter里面无法利用@Autowired。
所以此次文章用来解决这一问题。

经过查阅资料发现,spring容器初始化Bean的顺序是Listener->Filter->servlet.
那么我可以在Listener里面预先加载我们想要的Bean对象,然后经过Filter构造函数将对象传进去。

下面是具体的代码:

这个是启动监听器。

@Slf4j
@Configuration
@Order(Ordered.HIGHEST_PRECEDENCE)
public class StartLinster implements ApplicationListener<ApplicationEvent> {

    @Autowired
    TokenService tokenService;

    @Override
    public void onApplicationEvent(ApplicationEvent applicationEvent) {
        log.info("提前注入token");
    }
}

里面TokenService是Service层,也是我们想要注入的对象。

这个是Filter启动的相应代码,可以看到,Listener启动顺序是最高的。

@Bean
   public FilterRegistrationBean<AuthenticationFilter> initAuthenticationFilter(TokenService tokenService){


       FilterRegistrationBean<AuthenticationFilter> authenticationFilterFilter = new FilterRegistrationBean<>();
       AuthenticationFilter authenticationFilter = new AuthenticationFilter(tokenService);

       authenticationFilter.addExcludePatterns("/api/user/login");

       authenticationFilterFilter.setFilter(authenticationFilter);

       authenticationFilterFilter.setOrder(Ordered.LOWEST_PRECEDENCE);

       authenticationFilterFilter.addUrlPatterns("/api/*");

       return authenticationFilterFilter;
   }

相关文章:

  • 2021-10-16
  • 2022-02-18
  • 2021-10-29
  • 2022-12-23
  • 2021-09-25
  • 2022-01-09
  • 2021-08-18
  • 2022-12-23
猜你喜欢
  • 2021-10-21
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-03-31
  • 2021-12-02
相关资源
相似解决方案