首先就是自定义的Realm类的自动注入问题,如果采用@Component把类加载到容器时会出现自动注入失败的问题,网上找到的答案时,这是web加载顺序的问题,listern,filter,servlet是有这么一个顺序的,Realm属于filter先于servlet加载所以在filter里想用servlet里边的bean得到null自动注入失败。
解决方案就是在@Configuration 下通过@Bean的方式注入Realm可以解决, @Configuration 中所有带 @Bean 注解的方法都会被动态代理,因此调用该方法返回的都是同一个实例。具体看一下这篇文章@Configuration和@Componentq的区别
还有一个就是在自定义过滤器filter的时候,如果将过滤器加入到spring容器中了的话会导致自定义的Filter注册到ApplicationFilterChain,这样一来就变成你定义的类似/**这样的请求全部进入你自定义的filter,导致原本的定义的anon匹配路径也进入自定义的过滤器执行过滤操作就返回结果了。
解决方案就是:避免将自定义的filter注入到spring容器中去,直接new是一种方式,还有一种方式就时加到spring容器中去但不让它加入ApplicationFilterChain起作用就行了
@Bean
public FilterRegistrationBean registration(AccessTokenFilter filter) {
FilterRegistrationBean registration = new FilterRegistrationBean(filter);
registration.setEnabled(false);
return registration;
}